<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on BigDataPassion</title>
        <link>https://bigdatapassion.pl/post/</link>
        <description>Recent content in Posts on BigDataPassion</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>pl</language>
        <lastBuildDate>Fri, 22 Sep 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://bigdatapassion.pl/post/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>DataMass Gdańsk Summit 2023</title>
            <link>https://bigdatapassion.pl/blog/datamass-gda%C5%84sk-summit-2023/</link>
            <pubDate>Fri, 22 Sep 2023 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/datamass-gda%C5%84sk-summit-2023/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/data-mass-summit-gdansk-2023.png&#34; alt=&#34;Featured image of post DataMass Gdańsk Summit 2023&#34; /&gt;&lt;p&gt;Czy jesteś gotowy, aby zagłębić się w świat rozwiązań Big Data opartych na chmurze?&#xA;Jeśli tak, zapraszamy Cię na &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://summit.datamass.io/?utm_medium=email&amp;amp;utm_source=bdpassion&amp;amp;utm_campaign=2M04_09.2023&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Data Mass Gdańsk Summit 2023&lt;/a&gt;&lt;/strong&gt;,&#xA;podczas którego możesz uwolnić pełen potencjał technologii opartych na danych i zdobyć bezcenny wgląd w Big Data, Data Science, Machine Learning i AI,&#xA;a wszystko to w kontekście najnowocześniejszych rozwiązań chmurowych.&lt;/p&gt;&#xA;&lt;p&gt;Oto szczegóły, które musisz znać:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Wydarzenie: Data Mass Gdańsk Summit 2023&lt;/li&gt;&#xA;&lt;li&gt;Data: 5 października 2023 r&lt;/li&gt;&#xA;&lt;li&gt;Lokalizacja: Centrum Konferencyjne Muzeum II Wojny Światowej, Gdańsk, Polska&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Ekskluzywna zniżka 20%: Nie przegap naszej ekskluzywnej oferty!&#xA;Użyj specjalnego kodu &lt;strong&gt;„BIGDATAPASSION20”&lt;/strong&gt;, aby odblokować &lt;strong&gt;20% zniżki&lt;/strong&gt; na bilet na konferencję.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://summit.datamass.io/registration/?utm_medium=email&amp;amp;utm_source=bdpassion&amp;amp;utm_campaign=2M04_09.2023&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Zarejestruj się teraz&lt;/a&gt;&lt;/strong&gt;, aby zapewnić sobie miejsce&lt;/p&gt;&#xA;&lt;p&gt;Dlaczego warto wziąć udział w Data Mass Gdańsk Summit 2023?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Połącz się osobiście: Spotkajmy się wreszcie w Gdańsku! Ciesz się możliwością nawiązania kontaktów z innymi entuzjastami danych i ekspertami branżowymi, a wszystko to pod jednym dachem.&lt;/li&gt;&#xA;&lt;li&gt;Poszerzaj swoją wiedzę: zdobywaj spostrzeżenia i wiedzę na temat Big Data, analityki danych, uczenia maszynowego i sztucznej inteligencji, ze szczególnym uwzględnieniem rozwiązań chmurowych.&lt;/li&gt;&#xA;&lt;li&gt;Poznaj ekspertów branżowych: wejdź w interakcję z wybitnymi ekspertami i praktykami z najlepszych firm opartych na danych.&lt;/li&gt;&#xA;&lt;li&gt;Warsztaty praktyczne: Dołącz do warsztatów technicznych prowadzonych przez doświadczonych praktyków, oferujących praktyczne umiejętności i spostrzeżenia.&lt;/li&gt;&#xA;&lt;li&gt;Publiczność: Dołącz do wyjątkowego grona entuzjastów danych z Polski i świata.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Mamy ekscytujący zestaw prelegentów i tematów, których nie możesz przegapić, w tym:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Improving Psychotherapy through Data: Motivational Interviewing Optimization via NLP, Amit Spinrad, Data Scientist at Eleos Health&lt;/li&gt;&#xA;&lt;li&gt;AI Products: faster path from being right to being loved, Dainius Kniuksta, Artificial Intelligence Product Lead at Forecast.app&lt;/li&gt;&#xA;&lt;li&gt;Replacing the Data Platform during Hyper-Growth, Paweł Kupidura, Senior Software Engineer at Bolt&lt;/li&gt;&#xA;&lt;li&gt;Tracking All Ships in the World - sea of opportunities, Marek Skolimowski, Lead Analytics Solution Developer at DNV&lt;/li&gt;&#xA;&lt;li&gt;ML at Scale. How to productionize and operationalize hundreds of ML solutions in a simple and reliable way?, Tomasz Deręgowski, Director AI/ML Engineering at Nike&lt;/li&gt;&#xA;&lt;li&gt;Using Cloud Data Model to create control groups for Alexa users (at scale), Xingchen Ling, Senior Data Scientist, and Maciej Chmielarz, Software Development Manager, both from Amazon&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Nie czekaj!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;To Twoja szansa na zdobycie praktycznej wiedzy od najlepszych ekspertów w swojej dziedzinie i podniesienie swoich umiejętności na wyższy poziom.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://summit.datamass.io/registration/?utm_medium=email&amp;amp;utm_source=bdpassion&amp;amp;utm_campaign=2M04_09.2023&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Zarejestruj się już teraz&lt;/a&gt;&lt;/strong&gt;, aby zapewnić sobie miejsce na Data Mass Gdańsk Summit 2023.&#xA;Pamiętaj o ekskluzywnym &lt;strong&gt;rabacie 20%&lt;/strong&gt;, koniecznie podczas rejestracji użyj kodu &lt;strong&gt;„BIGDATAPASSION20”&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli masz jakieś pytania lub potrzebujesz dodatkowych informacji, nie wahaj się z nami skontaktować.&#xA;Do zobaczenia na Data Mass Gdańsk Summit w październiku 2023!&#xA;Gorące pozdrowienia,&#xA;WDTT&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Przegląd rozwiazań Big Data On Premise i Chmury Publicznej</title>
            <link>https://bigdatapassion.pl/blog/przegl%C4%85d-rozwiaza%C5%84-big-data-on-premise-i-chmury-publicznej/</link>
            <pubDate>Tue, 28 Mar 2023 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/przegl%C4%85d-rozwiaza%C5%84-big-data-on-premise-i-chmury-publicznej/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/landscape/big-data-landscape.jpg&#34; alt=&#34;Featured image of post Przegląd rozwiazań Big Data On Premise i Chmury Publicznej&#34; /&gt;&lt;p&gt;Świat (Big) Data jest pełny narzędzi pozwalających na pracę z danymi.&#xA;Możemy przebierać w rozwiązaniach open source, komercyjnych oraz cloud native.&#xA;Niestety wybór odpowiednich narzędzi nie jest prosty.&#xA;By ułatwić sobie to zadanie, zacząłem spisywać najpopularniejsze narzędzia wykorzystywane w świecie danych.&#xA;Dodatkowo podzielił te narzędzia na odpowiednie grupy względem środowiska pracy oraz zastosowania.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Poniżej moje zestawienie narzędzi, mam nadzieję, że będzie przydatna nie tylko dla mnie :)&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jeśli ktoś woli format arkusza kalkulacyjnego, lista jest dostępna także &lt;a class=&#34;link&#34; href=&#34;https://docs.google.com/spreadsheets/d/1aaPzLGZSPUM9B15Zj8eZpWQDNYt4iigWG6EwYEMGB-8/edit?usp=sharing&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tutaj&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli uważasz, że warto dodać do tej listy jakieś narzędzie, proszę o informację na maila, komentarz pod wpisem lub komentarz w arkuszu.&lt;/p&gt;&#xA;&lt;p&gt;Tabela jest podzielona na 6 kolumn:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Zastosowanie / Cel biznesowy - Tutaj podstawowe przeznaczenie grupy narzędzi&lt;/li&gt;&#xA;&lt;li&gt;Self manage (on premise or public cloud) - narzędzia którymi my zarządzamy bez względu czy zainstalujemy je w środowisku on premise czy w chmurze publicznej&lt;/li&gt;&#xA;&lt;li&gt;Amazon Web Services - rozwiązania natywne dla AWS&lt;/li&gt;&#xA;&lt;li&gt;Google Cloud Platform - rozwiązania natywne dla GCP&lt;/li&gt;&#xA;&lt;li&gt;Microsoft Azure - rozwiązania natywne dla Azure&lt;/li&gt;&#xA;&lt;li&gt;Third Party Cloud offering - rozwiązania cloud native firm trzecich dostępne w modelu PaaS lub SaaS (najczęsciej dostarczane na zasobach AWS i/lub GCP i/lub Azure)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;Zastosowanie / Cel biznesowy&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;Self manage (on premise or public cloud)&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;Amazon Web Services&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;Google Cloud Platform&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;Microsoft Azure&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th style=&#34;text-align: left&#34;&gt;Third Party Cloud offering&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Data Lake (składowanie petabajtów danych jako pliki lub obiekty)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Hadoop Distributed File System (HDFS)&lt;!-- raw HTML omitted --&gt; - Apache Ozone (S3 compatible, based on HDFS)&lt;!-- raw HTML omitted --&gt; - MinIO (S3 compatible)&lt;!-- raw HTML omitted --&gt; - Alluxio (formerly known as Tachyon, virtual distributed storage system, HDFS, S3, GCS, ABS and other)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Simple Storage Service (S3) (HDFS compatible)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Cloud Storage (HDFS compatible)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Data Lake (gen 2) (HDFS compatible)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Data Catalog, Data Governance, Data lineage etc.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Hive Metastore&lt;!-- raw HTML omitted --&gt; - Apache Atlas&lt;!-- raw HTML omitted --&gt; - Amundsen&lt;!-- raw HTML omitted --&gt; - Marquez&lt;!-- raw HTML omitted --&gt; - Datahub&lt;!-- raw HTML omitted --&gt; - OpenMetadata&lt;!-- raw HTML omitted --&gt; - EventCatalog&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Glue Data Catalog&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Data Catalog&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Data Catalog&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Data LakeHouse&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- HDFS + Apache Iceberg (made by Netflix),&lt;!-- raw HTML omitted --&gt; - HDFS + Apache Hudi (made by Uber),&lt;!-- raw HTML omitted --&gt; - HDFS + Databricks Delta Lake&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;(to co w on premise na S3)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;(to co w on premise na GCS)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;(to co w on premise na ADL)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Databricks SQL Analytics (preview)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Data Warehouse&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- IBM DB2 Warehouse,&lt;!-- raw HTML omitted --&gt; - Teradata,&lt;!-- raw HTML omitted --&gt; - Oracle Autonomouse Database / Exadata,&lt;!-- raw HTML omitted --&gt; - Vertica&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Redshift&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google BigQuery&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Synapse (wcześniej Azure SQL Data Warehouse)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Snowflake (AWS/GCP/Azure)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Data Lake + Data Warehouse integration&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Apache Hive/Apache Spark/etc,&lt;!-- raw HTML omitted --&gt; - Oracle Big Data SQL,&lt;!-- raw HTML omitted --&gt; - IBM Db2 Big SQL&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Redshift Spectrum&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google BigQuery (external tables)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Synapse (Spark SQL)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Big Data Platforms (Hadoop and Spark)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Hortonworks Data Platform (HDP) [legacy],&lt;!-- raw HTML omitted --&gt; - Cloudera Distribution for Hadoop (CDH) [legacy]&lt;!-- raw HTML omitted --&gt; - Cloudera Data Platform,&lt;!-- raw HTML omitted --&gt; - HPE Ezmeral (previous MapR),&lt;!-- raw HTML omitted --&gt; - Apache Bigtop&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- AWS EMR&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Dataproc&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure HDInsight (based on Hortonworks Data Platform) [legacy, killed by Cloudera]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Databricks Unified Data Analytics Platform (AWS/GCP/Azure),&lt;!-- raw HTML omitted --&gt; - Cloudera Data Platform Cloud (AWS/Azure)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;SQL on DataLake&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Apache Hive,&lt;!-- raw HTML omitted --&gt; - Apache Spark SQL,&lt;!-- raw HTML omitted --&gt; - Presto (PrestoDB, Facebook),&lt;!-- raw HTML omitted --&gt; - Trino (PrestoSQL),&lt;!-- raw HTML omitted --&gt; - Apache Drill,&lt;!-- raw HTML omitted --&gt; - Cloudera Impala,&lt;!-- raw HTML omitted --&gt; - Apache Pig,&lt;!-- raw HTML omitted --&gt; - Dremio&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- AWS Athena (Serverless, based on Presto)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google BigQuery (external tables)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Synapse (Spark SQL)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Databricks SQL Analytics&lt;!-- raw HTML omitted --&gt; - Ahana Cloud (Managed Presto on AWS)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;SQL relational databases&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- PostgreSQL,&lt;!-- raw HTML omitted --&gt; - MySQL,&lt;!-- raw HTML omitted --&gt; - Oracle Database,&lt;!-- raw HTML omitted --&gt; - MS SQL Server&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Amazon Relational Database Service (RDS) + Amazon Aurora&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Google Cloud SQL&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Azure SQL Database Azure Database&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;SQL Distributed Databases&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- CockroachDB&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Aurora global databases&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Cloud Spanner&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Cosmos DB (SQL API)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;NoSQL Databases&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Apache HBase (Hadoop Database),&lt;!-- raw HTML omitted --&gt; - Apache Cassandra / Scylla,&lt;!-- raw HTML omitted --&gt; - Accumulo&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon DynamoDB,&lt;!-- raw HTML omitted --&gt; - Amazon Keyspaces (Cassandra as Service),&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Bigtable (HBase API)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure CosmosDB (Cassandra API)&lt;!-- raw HTML omitted --&gt; - Azure Storage Tables&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- DataStax Astra (AWS/GCP/Azure)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;NoSQL Document Database&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- MongoDB&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon DocumentDB&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Cloud Datastore&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure DocumentDB,&lt;!-- raw HTML omitted --&gt; - Interfejs API Azure Cosmos DB dla bazy danych MongoDB&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- MongoDB Cloud (AWS/GCP/Azure)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;NoSQL Grapsh Database&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Neo4j&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Neptune&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;NoSQL Cache&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Redis,&lt;!-- raw HTML omitted --&gt; - Memcache&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon ElastiCache (Redis or Memcached)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Cloud Memorystore&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Redis Cache&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;NoSQL search engine&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Elastic Stack (Elasticsearch, Kibana, Logstash, etc),&lt;!-- raw HTML omitted --&gt; - Apache Solr (available in big data distribution)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amzon CloudSearch&lt;!-- raw HTML omitted --&gt; - Amazon Elasticsearch Service (ES)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Search&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Elastic Cloud (AWS/GCP/Azure)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Brocker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- RabbitMQ&lt;!-- raw HTML omitted --&gt; - ActiveMQ&lt;!-- raw HTML omitted --&gt; - ZeroMQ&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon MQ,&lt;!-- raw HTML omitted --&gt; - Amazon Simple Queue Service (SQS),&lt;!-- raw HTML omitted --&gt; - Amazon Simple Notification Service (SNS)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Cloud Pub/Sub&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Service Bus + Azure Queue Storage,&lt;!-- raw HTML omitted --&gt; - Azure Notification Hubs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Streaming&lt;!-- raw HTML omitted --&gt; - Brocker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Apache Kafka,&lt;!-- raw HTML omitted --&gt; - Apache Pulsar&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Kinesis Data Streams&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Pub/Sub,&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Event Hubs&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Stream processing&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Apache Spark [Structured] Streaming,&lt;!-- raw HTML omitted --&gt; - Apache Flink,&lt;!-- raw HTML omitted --&gt; - Apache Beam,&lt;!-- raw HTML omitted --&gt; - Kafka Streams,&lt;!-- raw HTML omitted --&gt; - Apache Storm,&lt;!-- raw HTML omitted --&gt; - Apache Heron (made by Twitter)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Kinesis Data Analytics (based on Apache Flink)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Dataflow (Apache Beam)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Stream Analytics&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Streaming platform&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Confluent Platform (based on Apache Kafka),&lt;!-- raw HTML omitted --&gt; - Hortonworks/Cloudera DataFlow (based on Apache Kafka and NiFi)&lt;!-- raw HTML omitted --&gt; - Ververica Platform (based on Apache Flink)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Managed Streaming for Apache Kafka (Amazon MSK),&lt;!-- raw HTML omitted --&gt; - Amazon Kinesis (multiple tools inside)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Dataproc (Big Data platform with Apache Kafka)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure HDInsight (based on Hortonworks DataFlow)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Confluent Cloud (AWS/GCP/Azure)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Real time data transformation&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Kafka Connect,&lt;!-- raw HTML omitted --&gt; - Apache NiFi + MiNiFi,&lt;!-- raw HTML omitted --&gt; - Apache Flume&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Kinesis Data Firehose&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Dataflow (Apache Beam)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure HDInsight (NiFi),&lt;!-- raw HTML omitted --&gt; - Azure DataFactory&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Batch data transformation (ETL, ELT)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Apache Beam,&lt;!-- raw HTML omitted --&gt; - Apache Spark,&lt;!-- raw HTML omitted --&gt; - dbt&lt;!-- raw HTML omitted --&gt; - Airbyte&lt;!-- raw HTML omitted --&gt; - Meltano&lt;!-- raw HTML omitted --&gt; - Apache Hop,&lt;!-- raw HTML omitted --&gt; - Twister2,&lt;!-- raw HTML omitted --&gt; - Apache Samza (made by LinkedIN)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon Glue (serverless Apache Spark)&lt;!-- raw HTML omitted --&gt; - AWS Data Pipeline&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Dataflow (Apache Beam)&lt;!-- raw HTML omitted --&gt; - Cloud DataPrep (created by Trifacta)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure DataFactory (with support for Databricks/Spark or whole HDInsight platform)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Integration between Relational Database and Data Lake&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Apache Sqoop,&lt;!-- raw HTML omitted --&gt; - Apache Spark&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- AWS Database Migration Service (AWS DMS)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Database Migration Service&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Change Data Capture&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Debezium + Kafka&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- AWS Database Migration Service (AWS DMS),&lt;!-- raw HTML omitted --&gt; - Debezium + Kinesis&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;-  Debezium + Pub/Sub&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Task Orchestration&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Apache Airflow,&lt;!-- raw HTML omitted --&gt; - Apache Oozie (big data distro),&lt;!-- raw HTML omitted --&gt; - Luigi (Spotify),&lt;!-- raw HTML omitted --&gt; - Azkaban&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- AWS Step Functions&lt;!-- raw HTML omitted --&gt; - AWS Data Pipeline,&lt;!-- raw HTML omitted --&gt; - Amazon Managed Workflows for Apache Airflow (MWAA)&lt;!-- raw HTML omitted --&gt; - Amazon Simple Workflow Service&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Cloud Composer (Apache Airflow)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Data Factory&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Astronomer (Managed Airflow)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Machine Learning and/or Data Science Platform&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Anaconda&lt;!-- raw HTML omitted --&gt; - Dataiku&lt;!-- raw HTML omitted --&gt; - H2O.ai&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Amazon SageMaker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Cloud AutoML,&lt;!-- raw HTML omitted --&gt; - Google Cloud Machine Learning Engine,&lt;!-- raw HTML omitted --&gt; - Google Cloud Datalab&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Machine Learning,&lt;!-- raw HTML omitted --&gt; - Azure Machine Learning Studio&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Databricks Unified Analytics Platform&lt;!-- raw HTML omitted --&gt; - Alteryx&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Data Science Notebooks&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Jupyter Family,&lt;!-- raw HTML omitted --&gt; - BeakerX,&lt;!-- raw HTML omitted --&gt; - Apache Zeppelin,&lt;!-- raw HTML omitted --&gt; - Polynote (made by Netflix)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- AWS EMR Notebooks&lt;!-- raw HTML omitted --&gt; - AWS SageMaker Notebooks&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Colaboratory (Colab)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Azure Notebooks (Killed by MS)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Data visualization&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Kibana (Elastic Stack)&lt;!-- raw HTML omitted --&gt; - Apache Superset&lt;!-- raw HTML omitted --&gt; - Redash (by Databricks)&lt;!-- raw HTML omitted --&gt; - Metabase&lt;!-- raw HTML omitted --&gt; - Tableau&lt;!-- raw HTML omitted --&gt; - Qlik&lt;!-- raw HTML omitted --&gt; - Microsoft Power BI (on premise edition)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- AWS QuickSight&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Data Studio&lt;!-- raw HTML omitted --&gt; - Google Looker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Microsoft Power BI&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Tableau Cloud&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;Production Ready ML services&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;(commercial offering by big tech vendors)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- AWS ML Services&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Google Cloud AI Building Blocks&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td style=&#34;text-align: left&#34;&gt;- Azure Cognitive Services&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;</description>
        </item><item>
            <title>Big Data Technology Warsaw Summit 2023</title>
            <link>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2023/</link>
            <pubDate>Fri, 24 Mar 2023 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2023/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/big-data-technology-summit-warsaw-2023.jpg&#34; alt=&#34;Featured image of post Big Data Technology Warsaw Summit 2023&#34; /&gt;&lt;p&gt;Mamy przyjemność zaprosić Państwa na 9. edycję Big Data Technology Warsaw Summit.&lt;/p&gt;&#xA;&lt;p&gt;W tym roku będziemy mieli okazję ponownie spotkać się w Warszawie w dniach 29-30 marca.&#xA;Oczywiście dla tych pasjonatów Big Data, którzy nie będą mogli przyjechać do Warszawy, jest możliwość pełnego udziału ONLINE w konferencji.&#xA;Zachęcamy do zapoznania się z poniższymi informacjami i wzięcia udziału w wydarzeniu.&lt;/p&gt;&#xA;&lt;p&gt;Dlaczego warto dołączyć do Big Data Technology Warsaw Summit stacjonarnie/online?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ponad 90 wybitnych prelegentów – wizjonerów i ekspertów pracujących z Big Data w czołowych firmach data-driven!&lt;/li&gt;&#xA;&lt;li&gt;6 praktycznych ścieżek – o najważniejszych aspektach Big Data: Data Engineering, AI and Data Science, Real-time Streaming, Architecture Operations &amp;amp; Cloud, Data Strategy and Roi&lt;/li&gt;&#xA;&lt;li&gt;20 stolików dyskusyjnych i warsztaty&lt;/li&gt;&#xA;&lt;li&gt;Prelegenci to uznani eksperci z Polski i zagranicy - inżynierowie, architekci, deweloperzy. Podzielą się doświadczeniem zdobytym podczas pracy nad swoimi projektami w takich firmach jak King, Airbnb, Google, Xebia, Meta, FreeNow i nie tylko&lt;/li&gt;&#xA;&lt;li&gt;Big Data Technology Warsaw Summit co roku gromadzi ponad 500 uczestników – profesjonalistów w dziedzinie big data. To najlepsze miejsce do wymiany doświadczeń z kolegami z branży!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Podczas konferencji Big Data Technology Warsaw Summit usłyszysz wyciągnięte wnioski i studia przypadków:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Living in Perfect Harmony - Where Music and Machine Learning Meet - Yama Anin Aminof, Data Scientist, Meta&lt;/li&gt;&#xA;&lt;li&gt;Degenerative feedback loops - how they emerge and why should we care? - Martin Dlask, Data Science Tech Lead, King&lt;/li&gt;&#xA;&lt;li&gt;Chronon - an open source feature engineering framework - Nikhil Simha, Staff Software Engineer, Airbnb&lt;/li&gt;&#xA;&lt;li&gt;What data engineering approach and culture fits your organisation better - Pierre de Leusse, Engineering Director, PepsiCo&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Szczegółowa agenda znajduje się &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/agenda/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tutaj&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli jeszcze nie macie biletu, to z kodem „BDPassion10” możecie skorzystać ze specjalnej 10% zniżki!&#xA;Rejestracja &lt;a class=&#34;link&#34; href=&#34;http://bit.ly/40b7S4P&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tutaj&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Praca z CLI w Apache Kafka</title>
            <link>https://bigdatapassion.pl/blog/praca-z-cli-w-apache-kafka/</link>
            <pubDate>Sat, 25 Feb 2023 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/praca-z-cli-w-apache-kafka/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kafka/feather-3237961_1280.jpg&#34; alt=&#34;Featured image of post Praca z CLI w Apache Kafka&#34; /&gt;&lt;p&gt;Poniżej lista przydatnych poleceń Apache Kafka.&lt;/p&gt;&#xA;&lt;p&gt;Dla ułatwienia korzystania, używane są odpowiednie zmienne systemowe oraz aliasy.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli korzystamy z CLI w postaci obrazu Docker ustawmy aliasy jak poniżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --rm -it confluentinc/cp-kafka --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --rm -it confluentinc/cp-kafka kafka-topics --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias kafka-topics&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;docker run --rm -it confluentinc/cp-kafka kafka-topics&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli jednak wolimy zainstalować Kafka CLI to ściągamy paczkę ze strony Apache Kafka i rozpakowujemy do wybranego katalogu, w moim przypadku ~/programs/kafka/&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias kafka-topics&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/programs/kafka/kafka_2.12-2.8.2/bin/kafka-topics.sh&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias kafka-console-consumer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/programs/kafka/kafka_2.12-2.8.2/bin/kafka-console-consumer.sh&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias kafka-console-producer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/programs/kafka/kafka_2.12-2.8.2/bin/kafka-console-producer.sh&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alias kafka-consumer-groups&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;~/programs/kafka/kafka_2.12-2.8.2/bin/kafka-consumer-groups.sh&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gdy korzystamy z Kafki z zabezpieczonym dostępem (certyfikat lub Kerberos) to w większości poleceniach będziemy potrzebować przekazać konfigurację do polecenia dlatego ustawiamy odpowiednia zmienna&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export KAFKA_CLIENT_CONFIG&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;client.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jesli wszystko działa&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export KAFKA_BROKER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;localhost:9092&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export TOPIC&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;test-topic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export GROUP&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;radek&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;topiki&#34;&gt;Topiki&#xA;&lt;/h1&gt;&lt;p&gt;lista:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --bootstrap-server $KAFKA_BROKER --list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --bootstrap-server $KAFKA_BROKER --list &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --command-config $KAFKA_CLIENT_CONFIG&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tworzenie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --create --bootstrap-server $KAFKA_BROKER --topic $TOPIC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --create --bootstrap-server $KAFKA_BROKER --topic $TOPIC --config cleanup.policy&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;compact&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --create --bootstrap-server $KAFKA_BROKER  --topic $TOPIC --replication-factor &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; --partitions &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;opis:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --describe --bootstrap-server $KAFKA_BROKER&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --describe --bootstrap-server $KAFKA_BROKER --topic $TOPIC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --describe --bootstrap-server $KAFKA_BROKER --topic $TOPIC &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --command-config $KAFKA_CLIENT_CONFIG&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --zookeeper $KAFKA_ZOOKEEPER --describe --under-replicated-partitions&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --describe --zookeeper $KAFKA_ZOOKEEPER --topic __consumer_offsets&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;usuwanie&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --bootstrap-server $KAFKA_BROKER --delete --topic $TOPIC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do usuwania należy włączyć tą możliwość w ustawieniach (delete.topic.enable), inaczej tylko oznacza topic jako usunięty.&lt;/p&gt;&#xA;&lt;p&gt;edycja:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --alter --zookeeper $KAFKA_ZOOKEEPER --topic $TOPIC --partitions &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --alter --zookeeper $KAFKA_ZOOKEEPER --topic $TOPIC --replication-factor &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --alter --zookeeper $KAFKA_ZOOKEEPER --topic $TOPIC --replica-assignment 1003:1004:1005,0:1:2,0:1:2,2:1:0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-topics --alter --zookeeper $KAFKA_ZOOKEEPER --topic __consumer_offsets --replication-factor &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;producent-i-konsument-w-konsoli&#34;&gt;Producent i konsument w konsoli&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-producer --broker-list $KAFKA_BROKER --topic $TOPIC&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-producer --broker-list $KAFKA_BROKER --topic $TOPIC --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse.key=true&amp;#34;&lt;/span&gt; --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key.separator=|&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat $TOPIC.json | kafka-console-producer --broker-list $KAFKA_BROKER --topic $TOPIC &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse.key=true&amp;#34;&lt;/span&gt; --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key.separator=|&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat $TOPIC.json | kafka-console-producer --broker-list $KAFKA_BROKER --topic $TOPIC &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse.key=true&amp;#34;&lt;/span&gt; --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key.separator=|&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property key.serializer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;org.apache.kafka.common.serialization.IntegerSerializer &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property value.serializer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;org.apache.kafka.common.serialization.StringSerializer &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;time &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i in &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;1..10&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  echo $i&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;|{&amp;#34;message&amp;#34;: &amp;#34;message&amp;#39;&lt;/span&gt;$i&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;}&amp;#39;&lt;/span&gt; | &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  kafka-console-producer --broker-list $KAFKA_BROKER --topic $TOPIC &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse.key=true&amp;#34;&lt;/span&gt; --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key.separator=|&amp;#34;&lt;/span&gt;; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;time &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i in &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;11..100&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; echo $i&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;|{&amp;#34;message&amp;#34;: &amp;#34;message&amp;#39;&lt;/span&gt;$i&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;}&amp;#39;&lt;/span&gt; | kafka-console-producer --broker-list $KAFKA_BROKER --topic $TOPIC --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;parse.key=true&amp;#34;&lt;/span&gt; --property &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;key.separator=|&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-consumer --bootstrap-server $KAFKA_BROKER --topic $TOPIC --from-beginning&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-consumer --bootstrap-server $KAFKA_BROKER --topic $TOPIC --from-beginning &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property print.key&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property print.value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property key.separator&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --consumer.config $KAFKA_CLIENT_CONFIG&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-consumer --bootstrap-server $KAFKA_BROKER --topic $TOPIC --from-beginning &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property print.key&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property print.value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property key.separator&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property key.deserializer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;org.apache.kafka.common.serialization.IntegerDeserializer &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property value.deserializer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;org.apache.kafka.common.serialization.StringDeserializer &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --consumer.config $KAFKA_CLIENT_CONFIG&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-consumer --bootstrap-server $KAFKA_BROKER --topic $TOPIC --from-beginning &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property print.key&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property print.value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property key.separator&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property key.deserializer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;org.apache.kafka.common.serialization.LongDeserializer &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property value.deserializer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;org.apache.kafka.common.serialization.StringDeserializer &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --consumer.config $KAFKA_CLIENT_CONFIG&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-consumer --bootstrap-server $KAFKA_BROKER &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --topic test-topic-out &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --from-beginning &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --formatter kafka.tools.DefaultMessageFormatter &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --property print.key&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --property print.value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --property key.deserializer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;org.apache.kafka.common.serialization.StringDeserializer &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --property value.deserializer&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;org.apache.kafka.common.serialization.StringDeserializer&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-consumer --bootstrap-server $KAFKA_BROKER --topic $TOPIC --from-beginning &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property print.key&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property print.value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property key.separator&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  | tee -a $TOPIC.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-console-consumer --bootstrap-server $KAFKA_BROKER --topic $TOPIC --from-beginning &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --property print.key&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property print.value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;true --property key.separator&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;|&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --consumer.config $KAFKA_CLIENT_CONFIG &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  | tee -a $TOPIC.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;grupy-konsumentów&#34;&gt;Grupy konsumentów&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-consumer-groups --bootstrap-server $KAFKA_BROKER --list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-consumer-groups --bootstrap-server $KAFKA_BROKER --describe --group $GROUP &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --command-config $KAFKA_CLIENT_CONFIG&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-consumer-groups --bootstrap-server $KAFKA_BROKER  --topic $TOPIC  --reset-offsets --to-earliest --group $GROUP &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --command-config $KAFKA_CLIENT_CONFIG&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kafka-consumer-groups --bootstrap-server $KAFKA_BROKER  --topic $TOPIC  --reset-offsets --to-earliest --group $GROUP &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --execute &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --command-config $KAFKA_CLIENT_CONFIG&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;zarządzanie-partycjami&#34;&gt;Zarządzanie partycjami&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-reassign-partitions.sh --zookeeper $KAFKA_ZOOKEEPER --reassignment-json-file /tmp/increase-replication-factor.json --execute&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;uruchamianie-i-zatrzymywanie&#34;&gt;Uruchamianie i zatrzymywanie&#xA;&lt;/h1&gt;&lt;p&gt;zookeeper:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/zookeeper-server-start.sh config/zookeeper.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;broker:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-server-start.sh config/server.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;zookeeper&#34;&gt;ZooKeeper&#xA;&lt;/h1&gt;&lt;p&gt;instalacja oddzielna:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd $ZOOKEEPER_HOME&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/zkCli.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wersja z paczki Apache Kafka:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/zookeeper-shell.sh $KAFKA_ZOOKEEPER&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;polecenia konsoli ZooKeepera:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls /brokers&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls /brokers/ids&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls /brokers/topics&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls /brokers/seqid&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;narzędzia&#34;&gt;Narzędzia&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/bin/kafka-consumer-groups.sh &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --topic $TOPIC --zookeeper $KAFKA_ZOOKEEPER &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --group test_group&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>DataMass Gdańsk Summit 2022</title>
            <link>https://bigdatapassion.pl/blog/datamass-gda%C5%84sk-summit-2022/</link>
            <pubDate>Fri, 16 Sep 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/datamass-gda%C5%84sk-summit-2022/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/datamass-summit-2022.png&#34; alt=&#34;Featured image of post DataMass Gdańsk Summit 2022&#34; /&gt;&lt;p&gt;Do you want to know &lt;strong&gt;how to use the cloud to solve Big Data, Data Science, Machine Learning and AI problems&lt;/strong&gt;?&lt;/p&gt;&#xA;&lt;p&gt;The next edition of the two-day &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://summit.datamass.io/?utm_source=patronat&amp;amp;utm_medium=patronat&amp;amp;utm_campaign=2B01_08.2022&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;DataMass Summit&lt;/a&gt;&lt;/strong&gt; conference in Gdansk is coming up!&lt;/p&gt;&#xA;&lt;p&gt;Don’t wait, join us today! September 29 is a day of workshops led by top practitioners, as well as an evening networking event! On September 30, on the other hand, it’s an all-day onsite conference, with a rich program of speakers - from prominent experts in Big Data, Data Science, Machine Learning and AI, all in the context of cloud solutions!&lt;/p&gt;&#xA;&lt;p&gt;Improve your knowledge with our speakers:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Running Apache Flink in any cloud environment - Márton Balassi, Apple&lt;/li&gt;&#xA;&lt;li&gt;Data Infrastructure in a Multi-Cloud environment – Wouter De Bie, Datadog&lt;/li&gt;&#xA;&lt;li&gt;Spark vs. Bigquery vs. Trino: Shopify’s journey of SQL transformations at scale – Kate Darnell, Shopify&lt;/li&gt;&#xA;&lt;li&gt;Bank Analytics in the Cloud – Łukasz Hunka, PKO Bank Polski&lt;/li&gt;&#xA;&lt;li&gt;Engineering Risk Assessment - how to measure the risk in enterprise IT infrastructure – Alicja Grochocka, Investment Banking Sector&lt;/li&gt;&#xA;&lt;li&gt;Data engineering at the scale of PepsiCo eCommerce, 3 years of experience – Pierre De Leusse, Dmitry Ulyanov, PepsiCo&lt;/li&gt;&#xA;&lt;li&gt;IoT as a data pipe between the physical world and the cloud AWS - Lukasz Malinowski, Amazon Web Service&lt;/li&gt;&#xA;&lt;li&gt;Breaking the stormy antipattern - from bad design to cloud native on Beam - Radosław Stankiewicz, Google&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And that’s not all! Visit our website - browse the &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://summit.datamass.io/#agenda/?utm_source=patronat&amp;amp;utm_medium=patronat&amp;amp;utm_campaign=2B01_08.2022&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;agenda&lt;/a&gt;&lt;/strong&gt;, meet our speakers and find out what else we have in store for you this year!&lt;/p&gt;&#xA;&lt;p&gt;Join the conference participants and take advantage of the promotion - with the code &lt;strong&gt;“BDPASSION10&amp;quot;&lt;/strong&gt; you will receive a 10% discount! Also, we highly recommend you to register your whole team - if you register 2 or more people, you will receive a 20% discount!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://summit.datamass.io/registration/?utm_source=patronat&amp;amp;utm_medium=patronat&amp;amp;utm_campaign=2B01_08.2022&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Application for participation here&amp;raquo;&amp;gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;See you in the last week of September in Gdansk!&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Infrastructure as Code</title>
            <link>https://bigdatapassion.pl/blog/infrastructure-as-code/</link>
            <pubDate>Tue, 19 Apr 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/infrastructure-as-code/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/iac-title-city.png&#34; alt=&#34;Featured image of post Infrastructure as Code&#34; /&gt;&lt;h2 id=&#34;tldr&#34;&gt;tl;dr&#xA;&lt;/h2&gt;&lt;p&gt;Infrastructure as Code (IaC) to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;przeniesienie prac administratora do repozytorium&lt;/li&gt;&#xA;&lt;li&gt;redukcja błędów i niespójności, większa niezawodność&lt;/li&gt;&#xA;&lt;li&gt;automatyzacja i integracja z CI/CD - powtarzalność&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;kierunek-w-it&#34;&gt;Kierunek w IT&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/iac-disaster-girl-mem-text.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W ciągu ostatnich kilku lat technologie IT ewoluowały do zróżnicowanych struktur usług, aplikacji, urządzeń, sieci i innych zasobów. Pomiędzy tymi elementami nowoczesnej architektury informatycznej istnieje coraz to większa korelacja via przepływ danych bez względu na różne lokalizacje tych zasobów. Infrastructure as Code to jedna z praktyk do zarządzania takim potencjałem.&lt;/p&gt;&#xA;&lt;h2 id=&#34;infrastructure-as-code-iac&#34;&gt;Infrastructure as Code (IaC)&#xA;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;IaC&lt;/code&gt; to jeden ze sposobów - praktyk tworzenia, modyfikacji i zarządzania zasobami. Definicję można rozbudować o zarządzanie zasobami takimi jak cokolwiek-aaS, IoT, aplikacje, klastry obliczeniowe, usługi, połączenia i urządzenia sieciowe czy to w środowisku on-premise czy w chmurze. Zarządzanie polega na kontrolowaniu zmian w środowiskach poprzez ich opis. Opisem jest oczekiwany stan - do tego wykorzystujemy opis &lt;code&gt;deklaratywny&lt;/code&gt;. Podejście deklaratywne to wskazanie właściwości obiektu jakie są dla nas stanem oczekiwanym. Dla kontrastu można wymienić podejście &lt;code&gt;imperatywne&lt;/code&gt;, gdzie nie opisujemy jaki efekt chcemy osiągnąć a w jaki sposób - można to opisać jako instrukcja rozkazów. Poniższy schemat obrazuje różnice.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;           podejście &#xA;_______________:______________&#xA;[deklaratywne] : [imperatywne]&#xA;     /\        :        |&#xA;    /  \       :       &amp;lt;A&amp;gt;-[B]&#xA;  [A]  [B]     :        |&#xA;  / \          :   [C]-&amp;lt;D&amp;gt;-[E]&#xA;[C] [D]        :    |   |      &#xA;    / \        :   [F] [G]&#xA;  [F] [G]      :       &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Modelowanie infrastruktury za pomocą kodu jest naturalnym wynikiem powstawania coraz to większego nacisku na m. in. bezpieczeństwo, powtarzalność, złożoność rozwiązań, dostępność, szybkość wdrażania i redukcji kosztów.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ta-historia-może-być-prawdziwa-&#34;&gt;Ta historia może być prawdziwa :)&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/iac-prawdziwa-historia-tak-bylo-nie-zmyslam.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wyobraźmy sobie, że przed nami kolejny release i należy zmianę wdrożyć na środowiska (np. dev, sit, uat, etc.) w różnych lokalizacjach (np. regiony w chmurze, urządzenia mobilne, itp.). Sukcesem dokonania tych zmian będzie zautomatyzowanie procesów Continuous Integration, Delivery, Deployment (skrótowo CI/CD) ze wszelkimi dodatkowymi działaniami od strony DevOpsów. CI/CD pokazało, że owe procesy można opisać w &lt;code&gt;repozytorium kodu&lt;/code&gt;. Teraz DevOps już wie, że podciągnięcie pozostałych działań do postaci kodu w gicie to wisienka na torcie automatyzacji przepływów pracy. I tak właśnie powstała Infrastructure as Code ;).&lt;/p&gt;&#xA;&lt;h2 id=&#34;rozwiązanie-&#34;&gt;Rozwiązanie &amp;hellip;&#xA;&lt;/h2&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;     Infrastructure as Code&#xA;   ___________________________&#xA;  |      |      |      |      |&#xA;(^_^)  [o_o]  (^.^)  (&amp;#34;.&amp;#34;)  ($.$)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;W kontekście naszych rozważań najważniejszym wyzwaniem jest sprostanie budowania bezpiecznych i niezawodnych platform działających na wielu obszarach technologicznych a nawet i prawnych. Dzięki redukcji zagrożeń poprzez możliwość inspekcji i wersjonowania kodu kontrolujemy potrzebę tworzenia i optymalizacji jakości produktu. Wyzwaniem również jest zmieniająca się koncepcja wdrażania i integracji, która była optymalnym rozwiązaniem w chwili jej tworzenia jak i zbieżność środowisk.&lt;/p&gt;&#xA;&lt;h3 id=&#34;0x00-nie-dla-każdego&#34;&gt;0x00 nie dla każdego&#xA;&lt;/h3&gt;&lt;p&gt;Zarządzanie wieloma lokalizacjami / usługami / sieciami / sprzętem / oprogramowaniem itd. to duży nakład pracy podczas tworzenia opisu naszej infrastruktury. Utrzymanie rozbudowanego środowiska wymaga kompleksowej wiedzy i wielopłaszczyznowego doświadczenia inżynierów. Połączenie przeróżnych dostawców sprzętu i usług zewnętrznych (np. dostęp do sieci) i zapewnienie skalowalności tychże rozwiązań to dopiero fundament do dalszych integracji.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;▄▄███▄▄·▄▄███▄▄·▄▄███▄▄·&#xA;██╔════╝██╔════╝██╔════╝&#xA;███████╗███████╗███████╗&#xA;╚════██║╚════██║╚════██║&#xA;███████║███████║███████║&#xA;╚═▀▀▀══╝╚═▀▀▀══╝╚═▀▀▀══╝&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Zapewnienie wysokich wartości dla SLA to marzenie każdego, lecz tylko część posiada na to odpowiednie moce w postaci zasobów na ciągłą synchronizację konfiguracji środowisk i wprowadzania nowych elementów.&lt;/p&gt;&#xA;&lt;h3 id=&#34;0xff-nie-na-wszystko&#34;&gt;0xff nie na wszystko&#xA;&lt;/h3&gt;&lt;p&gt;Staramy się ulepszać sposób w jaki pracujemy, podróż wydaje się nie mieć końca i to może być nasz przysłowiowy gwóźdź do trumny.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;     _                    _       _          _   _             &#xA;  __| | ___  _ __   ___  (_)___  | |__   ___| |_| |_ ___ _ __  &#xA; / _` |/ _ \| &amp;#39;_ \ / _ \ | / __| | &amp;#39;_ \ / _ \ __| __/ _ \ &amp;#39;__| &#xA;| (_| | (_) | | | |  __/ | \__ \ | |_) |  __/ |_| ||  __/ |    &#xA; \__,_|\___/|_| |_|\___| |_|___/ |_.__/ \___|\__|\__\___|_|    &#xA;  _   _                                    __           _      &#xA; | |_| |__   __ _ _ __    _ __   ___ _ __ / _| ___  ___| |_    &#xA; | __| &amp;#39;_ \ / _` | &amp;#39;_ \  | &amp;#39;_ \ / _ \ &amp;#39;__| |_ / _ \/ __| __|   &#xA; | |_| | | | (_| | | | | | |_) |  __/ |  |  _|  __/ (__| |_    &#xA;  \__|_| |_|\__,_|_| |_| | .__/ \___|_|  |_|  \___|\___|\__|   &#xA;                         |_|                                   &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ciągłe prace nad optymalizacją mogą i w większości przypadków prowadzą do błędnego koła, gdyż za każdym razem znajdzie się coś co można zrobić lepiej. Oczywiście należy starać się napisać kod tak dobrze na ile nasz stan wiedzy na to pozwala, lecz czynnikiem istotnym przy tworzeniu takiego bytu jest czas, jakim dysponujemy i trzeba go mieć na uwadze. Zauważyć należy, że multipla to też nie jest idealne auto, ale spełnia swoje zadanie jako pojazd - dość przejaskrawione porównanie ;p.&lt;/p&gt;&#xA;&lt;h2 id=&#34;ścieżka-rozwoju&#34;&gt;Ścieżka rozwoju&#xA;&lt;/h2&gt;&lt;p&gt;IaC to racjonalna ścieżka rozwoju nowoczesnego ekosystemu IT, kolejny krok w tworzeniu nowych platform i w rzeczywistości solidny model biznesowy. Zwrócić należy uwagę, że pierwotną ideą tego rozwiązania jest umożliwienie współpracy zespołów zajmujących się programowaniem z rozwojem infrastruktury. Jak tylko do tego dodamy takie idee jak: kod powinien być samodokumentujący się, rozwiązanie powinno być zgodne z duchem KISS, uniwersalność i skalowalność to mamy gotowy przepis na sukces, teoretycznie.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/iac-monkey-puppet-mem-text.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Rzeczywistość jest trochę inna. Zauważamy, że zbyt kompleksowe rozwiązania zabijają produktywność - staramy się z tym walczyć redukując złożoność. Optymalizacja w postaci czytelności kodu - zapewnia to lepszą dokumentację, tutaj stosujemy dobre praktyki, aby narzucić większą klarowność kodu i go ustandaryzować (składnię). Nieustannie dążymy do otrzymania stanu a nie programować - deklaratywne myślenie a więc powtarzalność nie zmienia kodu to oczekiwany stan a droga ku temu potrafi być wyboista. Kolejny ważny element poprawnie działającego kodu to ciągłe testowanie (Continuous Testing). CT jest krytycznym elementem rozbudowanych środowisk, podobnie jak przy każdym releasie oprogramowania i tu należy wystrzegać się błędów konfiguracyjnych, aby uniknąć problemów przy wdrożeniu.&lt;/p&gt;&#xA;&lt;h2 id=&#34;iac---nie-dziękuję&#34;&gt;IaC - nie dziękuję&#xA;&lt;/h2&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;W firmie mamy kilka scenariuszy ustandaryzowanych działań np.: skrypty, notatki w katalogu ICE-produkcja, mamy również zespół ludzi, którzy znają środowisko doskonale, bo pracują tu od 30 lat. Na co dzień radzimy sobie, gdyż nasze systemy nie zmieniły się od dwóch dekad.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/iac-seriously-bro-mem-text.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Próby wdrożenia podejścia IaC dla takich środowisk jest ogólnie ujmując niemożliwe (teoretycznie realne), gdyż wiąże się to z bardzo dużymi kosztami, które mogą przekroczyć budżet a czas ich realizacji będzie liczony w nieakceptowalnych terminach. Kolejny przesadny przykład, którego przesłaniem jest zobrazowanie, że nie wszystko można automatyzować w duchu Infrastructure as Code. Poniesione koszty nie są adekwatne do korzyści z nich wynikających. Elementy infrastruktury (systemy operacyjne, aplikacje, sprzęt warstwy sieciowej, etc.), które nie są już mocno rozwijane należy pozostawić w spokoju, gdyż próby spisania ich stanów i działań mogą być nieopłacalne. Dodatkowo ich szczątkowe użycie w obecnym świecie może działać niekorzystnie na ich bezpieczeństwo (dbanie o aktualizacje, naprawa na bieżąco błędów), integracje z aktualnymi zasobami (np. porzucenie starych protokołów komunikacji) czy utrzymanie (specjalistów starych technologii ubywa lub są bardzo drodzy).&lt;/p&gt;&#xA;&lt;h2 id=&#34;narzędzia&#34;&gt;Narzędzia&#xA;&lt;/h2&gt;&lt;p&gt;Wybór narzędzi jest uwarunkowany zasobami, jakie chcemy spisać. Część z tych aplikacji jest (w różnym stopniu) uniwersalna, może jednocześnie zapisać stan infrastruktury, konfigurację aplikacji czy usług chmurowych. O narzędziach będzie osobny artykuł, lecz tylko wspomnę o kilku, niektóre są specyficznym rozszeżeniem IaC (np. IaC Security)&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Nazwa&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Link&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;HashiCorp Terraform&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.terraform.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.terraform.io/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;RedHat Ansible&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.ansible.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.ansible.com/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;AWS CloudFormation&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/cloudformation/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://aws.amazon.com/cloudformation/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google Cloud Deployment Manager&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/deployment-manager/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cloud.google.com/deployment-manager/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Puppet&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://puppet.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://puppet.com/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Progress Chef&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.chef.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.chef.io/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;VMware SaltStack&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.saltstack.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.saltstack.com/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;(R)?ex&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.rexify.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.rexify.org/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pulumi&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.pulumi.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.pulumi.com/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Crossplane&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://crossplane.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://crossplane.io/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Spectral&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://spectralops.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spectralops.io/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;HashiCorp Vagrant&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.vagrantup.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.vagrantup.com/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;oak9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://oak9.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://oak9.io/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;HashiCorp Packer&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.packer.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.packer.io/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Microsoft Azure Resource Manager&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://azure.microsoft.com/features/resource-manager/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://azure.microsoft.com/features/resource-manager/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;best-practice&#34;&gt;Best Practice&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/iac-best-practices-mem-text.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Lista z ważniejszymi metodami pracy z &lt;code&gt;Infrastructure as Code&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;właściwe jest wykonywanie drobnych zmian, gdyż takie działania są łatwiejsze do wycofania się w przypadku natrafienia na błędy&lt;/li&gt;&#xA;&lt;li&gt;jak już kodujemy to wszystko - starajmy się tylko w wyniku konieczności wykorzystywać źródła zewnętrzne (np. wykonania aplikacji, której wynik można opisać w kodzie)&lt;/li&gt;&#xA;&lt;li&gt;dokumentujemy jak najmniej, gdyż sam kod odpowiednio zapisany będzie pełnił taką funkcję&lt;/li&gt;&#xA;&lt;li&gt;staramy się utrzymywać kod w modułach, podział sprzyja rozbudowie i jest klarowny w obsłudze&lt;/li&gt;&#xA;&lt;li&gt;wskazane jest przechowywanie każdej wersji konfiguracji&lt;/li&gt;&#xA;&lt;li&gt;skrupulatne testowanie to mniej czasu na obsługę błędów podczas wdrożenia&lt;/li&gt;&#xA;&lt;li&gt;używaj właściwego narzędzia do tego nad czym zarządzasz&lt;/li&gt;&#xA;&lt;li&gt;tagowanie w rozbudowanej infrastrukturze jest jak wygrać los na loterii&lt;/li&gt;&#xA;&lt;li&gt;staramy się, aby nasze szablony były jak najbardziej przydatne w przyszłości do ponownego użycia&lt;/li&gt;&#xA;&lt;li&gt;nie opieramy wywołań poprzez aplikacje pośrednie bez konieczności takich działań&lt;/li&gt;&#xA;&lt;li&gt;zadbaj o maksymalną przenośność kodu (np. Multi Cloud)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Confluent Platform - dystrybucja Big Data której sercem jest Apache Kafka</title>
            <link>https://bigdatapassion.pl/blog/confluent-platform-dystrybucja-big-data-kt%C3%B3rej-sercem-jest-apache-kafka/</link>
            <pubDate>Thu, 14 Apr 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/confluent-platform-dystrybucja-big-data-kt%C3%B3rej-sercem-jest-apache-kafka/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/confluent/confluent-banner.jpeg&#34; alt=&#34;Featured image of post Confluent Platform - dystrybucja Big Data której sercem jest Apache Kafka&#34; /&gt;&lt;p&gt;Apache Kafka stała się bazą wielu systemów przetwarzających dane strumieniowe.&#xA;Jednakże często potrzebujemy rozszerzyć jej możliwości dodatkowymi komponentami jak rejestr schematów, rest proxy, replikację danych, dodatkowe konektory i wiele innych.&#xA;W takich sytuacjach z pomocą przychodzi nam Confluent Platform, czyli kompletna dystrybucja Big Data, której sercem jest Apache Kafka.&#xA;Z platformy korzysta obecnie ponad 80% firm z zestawienia Fortune 100.&#xA;W tym artykule przedstawię najważniejsze informacje dotyczące tej platformy.&lt;/p&gt;&#xA;&lt;h3 id=&#34;komponenty-platformy&#34;&gt;Komponenty platformy&#xA;&lt;/h3&gt;&lt;p&gt;Sercem Confluent Platform jest Apache Kafka, oczywiście z uwzględnieniem wszystkich modułów, czyli:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Kafka Core (broker)&lt;/li&gt;&#xA;&lt;li&gt;Kafka Connect&lt;/li&gt;&#xA;&lt;li&gt;Kafka Streams&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/confluent/confluent-platform/confluent-platform.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jednakże największą zaletą korzystania z platformy są dodatkowe komponenty jak:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Confluent Schema Registry — rejestr schematów, który znacząco ułatwia pracę z komunikatami Avro, JSON lub Protobuf&lt;/li&gt;&#xA;&lt;li&gt;Confluent Clients — biblioteki dostępowe dla języków programowania spoza środowiska JVM jak C/C++, Python, Go, .NET&lt;/li&gt;&#xA;&lt;li&gt;Confluent REST Proxy — REST API przydatne do pracy, gdy nie możemy skorzystać z natywnych bibliotek klienckich&lt;/li&gt;&#xA;&lt;li&gt;Confluent Connectors to Kafka — dodatkowe pluginy dla Kafka Connect&lt;/li&gt;&#xA;&lt;li&gt;ksqlDB — narzędzie umożliwiające strumieniowe przetwarzanie danych oraz budowanie przepływu danych za pomocą języka SQL, bazuje na Kafka Streams oraz Kafka Connect, wcześniejsza nazwa to KSQL&lt;/li&gt;&#xA;&lt;li&gt;Confluent CLI — dodatkowe narzędzia konsolowe do codziennej pracy z platformą i jej składowymi&lt;/li&gt;&#xA;&lt;li&gt;Confluent Control Center — narzędzie UI do zarządzania naszym klastrem&lt;/li&gt;&#xA;&lt;li&gt;Confluent Replicator — narzędzie do replikacji danych pomiędzy klastrami&lt;/li&gt;&#xA;&lt;li&gt;Confluent Cluster Linking — narzędzie do synchronizacji danych pomiędzy klastrami Apache Kafka (binarnie)&lt;/li&gt;&#xA;&lt;li&gt;Confluent Auto Data Balancer / Self-Balancing Clusters — narzędzie umożliwiające automatyczne równomierne rozkładanie ruchu na Kafce, wykrywanie awarii oraz automatyczną naprawę klastra&lt;/li&gt;&#xA;&lt;li&gt;Tiered Storage — optymalizacja kosztów w chmurze przez trzymanie starszych danych np. w Amazon S3, Google Cloud Storage lub MinIO&lt;/li&gt;&#xA;&lt;li&gt;Confluent JMS Client — Klient JMS dla Kafki&lt;/li&gt;&#xA;&lt;li&gt;Confluent MQTT Proxy — Możliwość komunikacji z Kafką za pomocą protokołu MQTT (np. RabbitMQ go używa)&lt;/li&gt;&#xA;&lt;li&gt;Confluent Security Plugins — Dodatkowe pluginy zwiększające bezpieczeństwo&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Jak widać, platforma znacząco zwiększa możliwości, jakie oferuje Apache Kafka.&lt;/p&gt;&#xA;&lt;h3 id=&#34;możliwość-wdrożenia&#34;&gt;Możliwość wdrożenia&#xA;&lt;/h3&gt;&lt;p&gt;Jeśli chcielibyśmy wypróbować Confluent Platform, najlepszym rozwiązaniem jest skorzystanie z kontenerów dostępnych w &lt;a class=&#34;link&#34; href=&#34;https://hub.docker.com/u/confluentinc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Docker Hub&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Gdy przyjdzie nam skorzystać z Confluent Platform produkcyjnie, mamy trzy ścieżki do wyboru&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Klasyczna instalacja oparta o maszyny fizyczne (Bare metal) lub wirtualne&lt;/li&gt;&#xA;&lt;li&gt;Confluent for Kubernetes (CFK) — możliwość instalacji na dowolnym klastrze Kubernetes&lt;/li&gt;&#xA;&lt;li&gt;Confluent Cloud — gotowy serwis umożliwiający pracę z Confluent Platform w chmurze AWS, GCP lub Azure. Umożliwia on także pracę z Apache Kafka jako serverless.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;W przypadku pierwszej wersji, czyli samodzielnej instalacji, można ją przeprowadzić ręcznie za pomocą gotowych paczek ZIP/TAR lub repozytoriów Linux dla systemów Debian, Ubuntu, Red Hat oraz CentOS.&#xA;Dużo jednak lepszym i wygodniejszym rozwiązaniem jest skorzystanie z gotowych &lt;a class=&#34;link&#34; href=&#34;https://docs.confluent.io/ansible/current/overview.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ansible playbooks&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;licencja-i-cennik&#34;&gt;Licencja i cennik&#xA;&lt;/h3&gt;&lt;p&gt;Confluent Platform korzysta z trzech rodzajów licencji:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Apache 2.0 License — Apache Kafka, Kafka Streams, Kafka Connect, Kafka Clients, Serializers, Community Connectors&lt;/li&gt;&#xA;&lt;li&gt;Confluent Community License — REST Proxy, Schema Registry, ksqlDB, Confluent Connectors&lt;/li&gt;&#xA;&lt;li&gt;Confluent Enterprise License — Control Center, Replicator, Auto Data Balancer, Enterprise Connectors&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Z narzędzi dostępnych na licencji Apache 2.0 może skorzystać każda firma.&#xA;Jeśli jesteśmy firmą, która chce wykorzystać Confluent Platform do własnego użytku, to najprawdopodobniej możemy skorzystać za darmo także z rozwiązań objętych licencją community (szczegóły w treści &lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/confluent-community-license-faq/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;licencji&lt;/a&gt;).&#xA;Firmy chcące skorzystać ze wszystkich możliwości, jakie oferuje Confluent Platform, muszą liczyć się z koniecznością zakupu pełnej komercyjnej licencji, wraz z którą otrzymują wsparcie firmy Confluent.&#xA;Cennik nie jest publicznie dostępny, dlatego w przypadku zainteresowania proszę o &lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/contact&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;kontakt z przedstawicielami firmy&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;W przypadku wersji chmurowej mamy możliwość pracy z platformą w modelu płatności za użycie, zaś cennik jest publicznie dostępny na &lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/confluent-cloud/pricing/#clusterDetails&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;stronie Confluent Cloud&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;dodatkowe-informacje&#34;&gt;Dodatkowe informacje&#xA;&lt;/h3&gt;&lt;p&gt;W kolejnych artykułach przyjrzymy się bliżej możliwościom, jakie oferuje Confluent Platform.&lt;/p&gt;&#xA;&lt;p&gt;Więcej informacji można także znaleźć pod poniższymi adresami:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.confluent.io/platform/current/platform.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.confluent.io/platform/current/platform.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.confluent.io/platform/current/overview.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.confluent.io/platform/current/overview.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.confluent.io/operator/current/overview.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.confluent.io/operator/current/overview.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.confluent.io/ansible/current/overview.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.confluent.io/ansible/current/overview.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/confluent-cloud/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.confluent.io/confluent-cloud/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/fr-fr/blog/license-changes-confluent-platform/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.confluent.io/fr-fr/blog/license-changes-confluent-platform/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Instalacja CDP za pomocą Cloudera Managera on premise</title>
            <link>https://bigdatapassion.pl/blog/instalacja-cdp-za-pomoc%C4%85-cloudera-managera-on-premise/</link>
            <pubDate>Wed, 06 Apr 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/instalacja-cdp-za-pomoc%C4%85-cloudera-managera-on-premise/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/cloudera-logo-background-animation-2.gif&#34; alt=&#34;Featured image of post Instalacja CDP za pomocą Cloudera Managera on premise&#34; /&gt;&lt;p&gt;Instrukcja instalacji &lt;strong&gt;Cloudera Data Platform (CDP) + Cloudera Manager (CM)&lt;/strong&gt; na &lt;strong&gt;CentOS&lt;/strong&gt; w środowisku nieprodukcyjnym w celu prezentacji lub jako proof-of-concept. Instalujemy Cloudera Manager z JDK, bazą PostgreSQL, usługą Manager Server, Manager Agent i Cloudera Runtime.&lt;/p&gt;&#xA;&lt;p&gt;W artykule mamy opis platformy za pomocą dwóch skrótów, które określają platformę do zarządzania danymi.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Skrót&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Opis&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;CDP&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Cloudera Data Platform&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;CDH&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Cloudera Distribution Hadoop&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Termin &lt;code&gt;CDH&lt;/code&gt; określa &lt;em&gt;Cloudera&amp;rsquo;s Open Source Platform Distrbution including Apache Hadoop&lt;/em&gt;. Podczas instalacji niektóre nazwy pakietów w repozytoriach mają tajemnicze &lt;code&gt;cdh7&lt;/code&gt; w nazwie. Wynika to z pewnych powodów technicznych powiązanych z upgradeami. Generalnie mówimy o &lt;code&gt;CDP&lt;/code&gt; i możemy przyjąć, że &lt;code&gt;cdh7=cdp&lt;/code&gt; :)&lt;/p&gt;&#xA;&lt;p&gt;Kolejny skrót to &lt;code&gt;CM&lt;/code&gt; tj. orchestrator klastrów Big Data, posiada zautomatyzowane procedury pomocne przy pracy na co dzień dla administartorów.&lt;/p&gt;&#xA;&lt;h2 id=&#34;koncepcja&#34;&gt;Koncepcja&#xA;&lt;/h2&gt;&lt;p&gt;Naszym środowiskiem będzie 9 maszyn postawionych on premise. Pierwsza maszyna będzie pełniła funkcję zarządcy a pozostałe to składniki klastra. Kolejna porcja skrótów:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;DN&lt;/code&gt; Data Node - węzły przechowujące dane (bloki z danymi)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;NN&lt;/code&gt; Name Node - węzeł zarządzający ww danymi&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;                 [Cloudera Manager]&#xA;                         |&#xA;           [NameNode + pozostałe_serwisy]&#xA;                         |&#xA;      ----------------------------------------&#xA;      |     |      |     |      |     |      |&#xA; [DataNode] | [DataNode] | [DataNode] | [DataNode]&#xA;            |            |            |&#xA;       [DataNode]   [DataNode]   [DataNode]&#xA;&#xA;___________________________________________________&#xA; Schema Powered by Vim The power tool for everyone&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;przygotowanie-systemu-operacyjnego&#34;&gt;Przygotowanie Systemu Operacyjnego&#xA;&lt;/h2&gt;&lt;p&gt;Ze strony projektu CentOS pobieramy obraz &lt;code&gt;iso&lt;/code&gt; do instalacji. Link do wyboru architektury i typu &lt;a class=&#34;link&#34; href=&#34;https://www.centos.org/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.centos.org/download/&lt;/a&gt;. Bezpośredni link: &lt;a class=&#34;link&#34; href=&#34;http://isoredirect.centos.org/centos/7/isos/x86_64/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://isoredirect.centos.org/centos/7/isos/x86_64/&lt;/a&gt; również zaszyty w kodzie QR poniżej.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/qr-isoredirect.centos.org-centos-7-isos-x86-64.png&#34;&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/centos-logo.png&#34;&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;wspierana-wersja-centos&#34;&gt;Wspierana wersja CentOS&#xA;&lt;/h3&gt;&lt;p&gt;Tabelka przedstawia jaki system operacyjny jest kompatybilny z wersją Cloudery&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;CentOS&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Wersja CDP&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.9, 7.8, 7.7, 7.6, 7.5, 7.4, 7.3, 7.2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.3.x&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;!&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.9, 7.8, 7.7, 7.6, 7.5, 7.4, 7.3, 7.2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.2.x&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.6, 7.5, 7.4, 7.3, 7.2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.1.x&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.6, 7.5, 7.4, 7.3, 7.2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.0.x&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Wykrzyknik wskazuje z jakiej wersji CM/CDP będziemy korzystać.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;wspierane-systemy-plikow-pod-hdfs-a&#34;&gt;Wspierane systemy plikow pod HDFS-a&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;ext3&lt;/li&gt;&#xA;&lt;li&gt;ext4&lt;/li&gt;&#xA;&lt;li&gt;xfs&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;wersja-jvm&#34;&gt;Wersja jvm&#xA;&lt;/h3&gt;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;CDP&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Oracle JDK&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;OpenJDK&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.3.x&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.8&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.8, 11.0.3+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;!&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.2.x&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.8&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.8, 11.0.3+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.1.x&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.8&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.8, 11.0.3+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.0.x&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.8&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;1.8, 11.0.3+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Zalecaną wersją jest OpenJDK &lt;code&gt;1.8u212&lt;/code&gt;. Należy pamiętać, że wersje JDK 7 i niższe nie są wspierane dla CM 6.x i CDP 6.x.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Wykrzyknik wskazuje z jakiej wersji CM/CDP będziemy korzystać.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://supportmatrix.cloudera.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://supportmatrix.cloudera.com/&lt;/a&gt;&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;kompatybilność-wersji-cdp-i-cm&#34;&gt;Kompatybilność wersji CDP i CM&#xA;&lt;/h3&gt;&lt;p&gt;Aplikacje mają konwencję nazewnictwa wersji: &lt;code&gt;&amp;lt;major&amp;gt;&lt;/code&gt;.&lt;code&gt;&amp;lt;minor&amp;gt;&lt;/code&gt;.&lt;code&gt;&amp;lt;maintenance&amp;gt;&lt;/code&gt;. Wersja &lt;code&gt;&amp;lt;major&amp;gt;&lt;/code&gt;.&lt;code&gt;&amp;lt;minor&amp;gt;&lt;/code&gt; Cloudera Managera musi być identyczna lub wyższa z wersją CDP, wersja &lt;code&gt;&amp;lt;minor&amp;gt;&lt;/code&gt; jest tu pomijana.&lt;/p&gt;&#xA;&lt;p&gt;Przykłady:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;CM&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;ok?&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;CDP&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.0.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;[x]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.0.0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.1.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;[x]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.0.0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.2.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;[x]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.0.1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.2.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;[x]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.2.0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.2.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;[x]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.1.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.2.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;[ ]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;7.3.9&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;wymagania-sprzętowe&#34;&gt;Wymagania sprzętowe&#xA;&lt;/h3&gt;&lt;p&gt;Dla naszego środowiska (to jest lab = usługa nieprodukcyjna) założyliśmy, że każda maszyna musi mieć&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dysk 40 GB&lt;/li&gt;&#xA;&lt;li&gt;8 vCPU&lt;/li&gt;&#xA;&lt;li&gt;RAM 24 GB&lt;/li&gt;&#xA;&lt;li&gt;DN 8 x 2 GB&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;generowanie-i-dystrybucja-kluczy-ssh&#34;&gt;Generowanie i dystrybucja kluczy ssh&#xA;&lt;/h3&gt;&lt;p&gt;Po instalacji OS logujemy się na pierwszą maszynę i tworzymy parę kluczy do połączeń po ssh. Najszybciej wykonać to poleceniem &lt;code&gt;ssh-keygen&lt;/code&gt;, właściwe polecenie:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/usr/bin/ssh-keygen -t rsa&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Za pomocą skryptu &lt;code&gt;ssh-copy-id&lt;/code&gt; zawartość pliku &lt;code&gt;id_rsa.pub&lt;/code&gt; dopiszemy do pliku &lt;code&gt;authorized_keys&lt;/code&gt; na pozostałych maszynach. Na pierwszym (pierwszy) hoście możemy tego dokonać wykonując polecenie&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[root@hadoop160 ~]# cat ~/.ssh/id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nim prześlemy nasz klucz publiczny na inne hosty to sprawdzamy czy możemy nawiązać połączenie za pomocą ssh do samych siebie a więc logując się do tej samej maszyny na której jesteśmy.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[root@hadoop160 ~]# ssh 0&#xA;The authenticity of host &amp;#39;0 (0.0.0.0)&amp;#39; can&amp;#39;t be established.&#xA;ECDSA key fingerprint is SHA256:LDxMU+4lcrblD9c/VsUznP4adzI5Rc+sp6wFiJNUn5A.&#xA;ECDSA key fingerprint is MD5:6f:a2:20:97:1c:2d:e4:31:cd:4e:4d:f9:a4:15:e1:90.&#xA;Are you sure you want to continue connecting (yes/no)? yes&#xA;Warning: Permanently added &amp;#39;0,0.0.0.0&amp;#39; (ECDSA) to the list of known hosts.&#xA;Last login: Tue Dec 21 16:59:22 2021 from 192.168.133.250&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Jeśli mamy podobny wynik to używamy skryptu &lt;code&gt;ssh-copy-id&lt;/code&gt; do wykonania tego samego zadania tylko na innych hostach.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Należy zwrócić uwagę, że domyślnie systemy modern linux mają wyłączoną możliwość zdalnego logowania się jako administrator (przeważnie jest to użytkownik &lt;code&gt;root&lt;/code&gt;). Rozwiązaniem może być logowanie się jako inny użytkownik a następnie podniesienie swoich uprawnień za pomocą polecenia &lt;code&gt;sudo&lt;/code&gt; lub dopisanie w &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; linijki &lt;code&gt;PermitRootLogin yes&lt;/code&gt; i restart usługi &lt;code&gt;systemctl restart sshd&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;dhcp-w-sieci&#34;&gt;DHCP w sieci&#xA;&lt;/h3&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Protokół IP wersji 6 nie jest wspierany i musi być wyłączony.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;W naszym środowisku musimy zadbać o niezmienność adresu IP z nazwą domenową każdego z hostów, gdyż każdy nod (węzęł) w klastrze identyfikuje się nazwą domenową. Najprostszym rozwiązaniem będzie przypisanie na stałe adresów IPv4 dla sieci w której będzie działać Hadoop. W naszym przypadku należy utworzyć plik &lt;code&gt;net-172.31.184-24.xml&lt;/code&gt;, treść poniżej.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;network connections=&amp;#39;1&amp;#39;&amp;gt;&#xA;  &amp;lt;name&amp;gt;net-172.31.184-24&amp;lt;/name&amp;gt;&#xA;  &amp;lt;uuid&amp;gt;00000000-0172-0031-0184-000000000000&amp;lt;/uuid&amp;gt;&#xA;  &amp;lt;forward mode=&amp;#39;nat&amp;#39;&amp;gt;&#xA;    &amp;lt;nat&amp;gt;&#xA;      &amp;lt;port start=&amp;#39;1024&amp;#39; end=&amp;#39;65535&amp;#39;/&amp;gt;&#xA;    &amp;lt;/nat&amp;gt;&#xA;  &amp;lt;/forward&amp;gt;&#xA;  &amp;lt;mac address=&amp;#39;40:00:ac:1f:b8:fa&amp;#39;/&amp;gt;&#xA;  &amp;lt;ip address=&amp;#39;172.31.184.250&amp;#39; netmask=&amp;#39;255.255.255.0&amp;#39;&amp;gt;&#xA;    &amp;lt;dhcp&amp;gt;&#xA;      &amp;lt;range start=&amp;#39;172.31.184.240&amp;#39; end=&amp;#39;172.31.184.249&amp;#39;/&amp;gt;&#xA;      &amp;lt;host mac=&amp;#39;40:00:ac:1f:b8:01&amp;#39; name=&amp;#39;hadoop001&amp;#39; ip=&amp;#39;172.31.184.1&amp;#39;/&amp;gt;&#xA;      &amp;lt;host mac=&amp;#39;40:00:ac:1f:b8:02&amp;#39; name=&amp;#39;hadoop002&amp;#39; ip=&amp;#39;172.31.184.2&amp;#39;/&amp;gt;&#xA;[...]&#xA;    &amp;lt;/dhcp&amp;gt;&#xA;  &amp;lt;/ip&amp;gt;&#xA;&amp;lt;/network&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;a następnie go zaimportować za pomocą polecenia&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@bigdatalab:~# virsh net-define net-172.31.184-24.xml &#xA;Network net-172.31.184-24 defined from net-172.31.184-24.xml&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tabelka przedstawia właściwą konfiguracje klastra w 2/3 warstwie sieci:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Rola&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;MAC adres&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;nazwa hosta (fqdn)&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;adres IPv4&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Manager&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:9f&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop159.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.159&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Worker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:a0&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop160.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.160&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Worker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:a1&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop161.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.161&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Worker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:a2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop162.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.162&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Worker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:a3&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop163.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.163&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Worker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:a4&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop164.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.164&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Worker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:a5&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop165.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.165&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Worker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:a6&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop166.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.166&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Worker&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;40:00:ac:1f:b8:a7&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;hadoop167.bigdatalinux.org&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;172.31.184.167&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;instalacja-wymaganych-składników-os-i-narzędzi&#34;&gt;Instalacja wymaganych składników OS i narzędzi&#xA;&lt;/h3&gt;&lt;p&gt;Aktualizacja OS i instalacja narzędzi&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yum update  -y&#xA;yum -y upgrade&#xA;yum install -y epel-release&#xA;yum install -y wget htop ntp byobu ncdu python-psycopg2&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;host-name-i-wpisy-w-pliku-hosts&#34;&gt;Host Name i wpisy w pliku hosts&#xA;&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;172.31.184.159 hadoop159.bigdatalinux.org hadoop159&#xA;172.31.184.160 hadoop160.bigdatalinux.org hadoop160&#xA;172.31.184.161 hadoop161.bigdatalinux.org hadoop161&#xA;172.31.184.162 hadoop162.bigdatalinux.org hadoop162&#xA;172.31.184.163 hadoop163.bigdatalinux.org hadoop163&#xA;172.31.184.164 hadoop164.bigdatalinux.org hadoop164&#xA;172.31.184.165 hadoop165.bigdatalinux.org hadoop165&#xA;172.31.184.166 hadoop166.bigdatalinux.org hadoop166&#xA;172.31.184.167 hadoop167.bigdatalinux.org hadoop167&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;for i in &amp;#34;&amp;#34; --pretty --static --transient ; do&#xA;hostnamectl set-hostname hadoop159.bigdatalinux.org ${i} ; done&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;synchronizacja-czasu-ntp&#34;&gt;Synchronizacja czasu (ntp)&#xA;&lt;/h3&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yum install -y ntp&#xA;systemctl start ntpd&#xA;systemctl enable ntpd&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sprawdzamy stan synchronizacji poleceniem &lt;code&gt;ntpstat&lt;/code&gt; lub &lt;code&gt;ntptime&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Coraz częściej zaleca się używanie &lt;code&gt;chrony&lt;/code&gt;. Więcej pod adresem &lt;a class=&#34;link&#34; href=&#34;https://chrony.tuxfamily.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://chrony.tuxfamily.org/&lt;/a&gt;&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;security-enhanced-linux--firewall&#34;&gt;Security-Enhanced Linux + Firewall&#xA;&lt;/h3&gt;&lt;p&gt;SELinux nie powinien blokować działać CDP i CM. Na potrzeby naszego laba będzie on wyłączony. Rzecz ma się podobnie dla iptables (usługi firewalld) żadne regułki filtrowania sieciowego nie będą włączone.&lt;/p&gt;&#xA;&lt;h4 id=&#34;selinux&#34;&gt;SELinux&#xA;&lt;/h4&gt;&lt;p&gt;Zauważmy, że plik &lt;code&gt;/etc/sysconfig/selinux&lt;/code&gt; wskazuje (jest linkiem) na &lt;code&gt;/etc/selinux/config&lt;/code&gt;, więc zmiany możemy dokonac w jednym miejscu.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sed -i &amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39; /etc/selinux/config&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Przed zmianą było &lt;code&gt;SELINUX=enforcing&lt;/code&gt; a po zmianie &lt;code&gt;SELINUX=disabled&lt;/code&gt;. Jeśli nie chcemy restartować systemu operacyjnego to możemy wykonać polecenie &lt;code&gt;setenforce 0&lt;/code&gt; a następnie sprawdzić poleceniem &lt;code&gt;getenforce&lt;/code&gt; (oczekiwany wynik: &lt;code&gt;Permissive&lt;/code&gt;). W przypadku rebootu &lt;code&gt;getenforce&lt;/code&gt; zwróci &lt;code&gt;Disabled&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;firewalld&#34;&gt;Firewalld&#xA;&lt;/h4&gt;&lt;p&gt;W pierwszym poleceniu wyłączamy autostart usługi przy starcie systemu. W drugim poleceniu zatrzymujemy ją a w ostatnim sprawdzamy w poszukiwaniu oczekiwanego statusu &lt;code&gt;Active: inactive (dead)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;systemctl disable firewalld&#xA;systemctl stop firewalld&#xA;systemctl status firewalld&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;pobieramy-instalator-cm&#34;&gt;Pobieramy instalator CM&#xA;&lt;/h2&gt;&lt;p&gt;Będąc zalogowanym na maszynie zarządzającej (tu hadoop159.bigdatalinux.org) pobieramy a następnie uruchamiamy instalator Cloudera Managera&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wget https://archive.cloudera.com/cm7/7.4.4/cloudera-manager-installer.bin&#xA;chmod a+x cloudera-manager-installer.bin&#xA;./cloudera-manager-installer.bin&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;W celu odinstalowania należy uruchomić skrypt &lt;code&gt;/opt/cloudera/installer/uninstall-cloudera-manager.sh&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;instalacja-cm&#34;&gt;Instalacja CM&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x00.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Akceptujemy warunki licencji&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x01.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po kilkuminutowej instalacji usługi CM&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x03.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;zostaje wyświetlony komunikat. Informuje o danych do zalogowania się do &lt;code&gt;CM&lt;/code&gt;. Login to &lt;code&gt;admin&lt;/code&gt; i hasło również &lt;code&gt;admin&lt;/code&gt;. W przeglądarce wskazujemy adres IP maszyny i port &lt;code&gt;7180&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x04.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tutaj http://172.31.184.159:7180&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x10.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Pozostaje wybrać sposobu korzystania z Cloudera Manager. Do wyboru&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;import licencji &lt;code&gt;Upload Cloudera Data Platform License&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;60 dniowy trial &lt;code&gt;Try Cloudera Data Platform for 60 days&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Wybieramy &lt;code&gt;Try Cloudera Data Platform for 60 days&lt;/code&gt; a następnie akceptujemy postanowienia licencji zaznaczając &lt;code&gt;Yes, I accept the Cloudera Standard License Terms and Conditions.&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;tworzenie-klastra&#34;&gt;Tworzenie klastra&#xA;&lt;/h2&gt;&lt;h3 id=&#34;krok-1&#34;&gt;Krok 1&#xA;&lt;/h3&gt;&lt;p&gt;Domyślnie pojawi nam się wizard, który pomoże przy tworzeniu nowego klastra. Po wyświetleniu się tytułu &lt;code&gt;Add Traditional Bare Metal Cluster&lt;/code&gt; przechodzimy dalej klawiszem &lt;code&gt;Continue&lt;/code&gt;.  Wpisujemy nazwę klastra &lt;code&gt;bigdatapassion&lt;/code&gt; i ponownie wybieramy &lt;code&gt;Continue&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x11.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-2&#34;&gt;Krok 2&#xA;&lt;/h3&gt;&lt;p&gt;Wskazujemy hosty, które będą w klastrze CDP. Możemy tu w każdej linijce wkleić nazwę domenową każdego noda lub użyć wzorca &lt;code&gt;hadoop16[0-7].bigdatalinux.org&lt;/code&gt;. Taka konstrukcja doda 8 nodów. Po wpisaniu nazwy hostów należy wybrać klawisz &lt;code&gt;Search&lt;/code&gt; a po wyświetleniu się oczekiwanych maszyn i tu wybieramy &lt;code&gt;Continue&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x120.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x130.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-3&#34;&gt;Krok 3&#xA;&lt;/h3&gt;&lt;p&gt;Na kolejnym ekranie wybieramy skąd będą pobierane repozytoria. Dla &lt;code&gt;Repository Location&lt;/code&gt; używamy &lt;code&gt;Cloudera Repository (Requires direct Internet access on all hosts.)&lt;/code&gt;. Reszta pozostaje bez zmian.&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-4&#34;&gt;Krok 4&#xA;&lt;/h3&gt;&lt;p&gt;Mamy 3 możliwości zainstalowania Java Development Kit (JDK).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x142.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;instalacja ręczna (np. za pomocą playbooka ansible) - Manually manage JDK&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;instalacja zalecanej wersji przez CM - Install a Cloudera-provided version of OpenJDK&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;instalacja z repo OS - Install a system-provided version of OpenJDK&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Wybierzemy opcję numer 2 a więc Cloudera zainstaluje zalecaną wersję OpenJDK&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-5&#34;&gt;Krok 5&#xA;&lt;/h3&gt;&lt;p&gt;Podczas instalacji Cloudery wymagany jest dostęp do konta &lt;code&gt;root&lt;/code&gt; na każdym węźle. Zadbaliśmy o to podczas tworzenia klucza i jego dystrybucji na pozostałe hosty. &lt;code&gt;SSH Username&lt;/code&gt; pozostaje bez zmian (tj. &lt;code&gt;root&lt;/code&gt;). Musimy wskazać klucz prywatny i go uploadować. Z &lt;code&gt;Authentication Method&lt;/code&gt; wybieramy 2. opcję &lt;code&gt;All hosts accept same private key&lt;/code&gt;. Pojawi się możliwość wrzucenia pliku klucza prywatnego (nazwa: &lt;code&gt;id_ed25519&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x14.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-6&#34;&gt;Krok 6&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x160.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zakończeniu instalacji agentów na każdym węźle w statusie otrzymamy &lt;code&gt;Installation completed successfully&lt;/code&gt; i podświetli się klawisz &lt;code&gt;Continue&lt;/code&gt; i przechodzimy do kolejnego kroku.&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-7&#34;&gt;Krok 7&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x172.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W nowej zakładce można podejrzeć już jakieś informacje o hostach &lt;code&gt;http://172.31.184.159:7180/cmf/hardware/hosts&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-8&#34;&gt;Krok 8&#xA;&lt;/h3&gt;&lt;p&gt;W dwóch testach dokonujemy sprawdzenia jakości połączeń sieciowych i kondycji komponentów klastra.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x182.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Problem może wystąpić z nadmiernym używaniem swapu i włączonym Transparent Huge Page.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x184.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Pierwsze naprawiamy poleceniem (na każdym hoście)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo &amp;#34;vm.swappiness=1&amp;#34; &amp;gt;&amp;gt; /etc/sysctl.conf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;a kolejne&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/defrag&#xA;echo never &amp;gt; /sys/kernel/mm/transparent_hugepage/enabled&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Jeśli nie dokonamy rekomendowanych zmian należy wybrać &lt;code&gt;I understand the risks of not running the inspections or the detected issues, let me continue with cluster setup&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;instalacja-składników-klastra&#34;&gt;Instalacja składników klastra&#xA;&lt;/h2&gt;&lt;p&gt;Z menu głównego po lewej stronie rozwijamy &lt;code&gt;Cluster&lt;/code&gt; a w nim mamy 2 sposoby dodania usług do nowo utworzonego klastra.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x204.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Wybieramy &lt;code&gt;Add Services&lt;/code&gt;, wtedy uruchomimy wizard a w nim mamy kilka predefiniowanych zestawów aplikacji.&lt;/li&gt;&#xA;&lt;li&gt;Gdybyśmy wybrali nazwę utworzonego klastra tj. &lt;code&gt;bigdatapassion&lt;/code&gt; przechodzimy do ekranu w którego górnej części jest rozwijane menu &lt;code&gt;Actions&lt;/code&gt; gdzie i tu mamy możliwość wybrania składników klastra obliczeniowego pod przyciskiem &lt;code&gt;Add service&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Po wybraniu &lt;code&gt;Add Services&lt;/code&gt; mamy 7 kroków&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-1---wybór-usług&#34;&gt;Krok 1 - wybór usług&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x205.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Do wyboru 3 gotowe konfiguracje lub własna kompozycja usług&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Data Engineering&lt;/li&gt;&#xA;&lt;li&gt;Data Mart&lt;/li&gt;&#xA;&lt;li&gt;Operational Database&lt;/li&gt;&#xA;&lt;li&gt;Custom Services (*)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Wybierając ostatnią możliwość zainstalujemy tylko hadoopowy system plików (HDFS) i wybierzemy &lt;code&gt;Continue&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-2---przypisanie-hostów-do-roli&#34;&gt;Krok 2 - przypisanie hostów do roli&#xA;&lt;/h3&gt;&lt;p&gt;Ponieważ wszystkie 8 hostów ma taką samą konfigurację sprzętową (ilość podpiętych zasobów dyskowych) to wybieramy, że wszystkie nody będą DN a więc węzłami, które będą odpowiedzialne za przechowywanie danych na HDFS-ie. Pierwszy host będzie pełnił rolę NN a więc usługi zarządzającej rozmieszczeniem danych na DN.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x206.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy okienko pod &lt;code&gt;DataNode x 7 New&lt;/code&gt; i z menu rozwijanego &lt;code&gt;All Hosts&lt;/code&gt; (alternatywnie: &lt;code&gt;Custom...&lt;/code&gt; i tu checkboksami zaznaczamy wszystkie wiersze). Parametry pozostałem dla roli &lt;code&gt;HDFS&lt;/code&gt; jak i &lt;code&gt;Cloudera Management Service&lt;/code&gt; pozostają bez zmian.&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-3---podłączenie-do-bazy-danych&#34;&gt;Krok 3 - podłączenie do bazy danych&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x207.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wskazujemy z jakiej bazy danych usługa &lt;code&gt;Reports Manager&lt;/code&gt; ma korzystać. Wybór jest pomiędzy:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;uruchomioną już bazę danych (zainstalowaną na zarządcy a więc na maszynie &lt;code&gt;hadoop159.bigdatalinux.org&lt;/code&gt; - tam gdzie działa &lt;code&gt;Cloudera Manager&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;własną zainstalowaną ręcznie / uruchomioną na innym hoście.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Do wyboru mamy 3 rodzaje&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MySQL&lt;/li&gt;&#xA;&lt;li&gt;PostgreSQL&lt;/li&gt;&#xA;&lt;li&gt;Oracle&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dane autoryzacji do DB na maszynie zarządzającej są wyświetlane w interfejsie webowym, można je również odczytać z pliku &lt;code&gt;/etc/cloudera-scm-server/db.mgmt.properties&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;grep &amp;#34;REPORTSMANAGER&amp;#34; /etc/cloudera-scm-server/db.mgmt.properties &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;com.cloudera.cmf.REPORTSMANAGER.db.type=postgresql&#xA;com.cloudera.cmf.REPORTSMANAGER.db.host=hadoop159.bigdatalinux.org:7432&#xA;com.cloudera.cmf.REPORTSMANAGER.db.name=rman&#xA;com.cloudera.cmf.REPORTSMANAGER.db.user=rman&#xA;com.cloudera.cmf.REPORTSMANAGER.db.password=tXHf3CYkcp&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Zastosujemy domyślne rozwiązanie i wykorzystamy już istniejącą bazę. Koniecznym krokiem jest &lt;code&gt;Test Connection&lt;/code&gt; a wtedy podświetli się &lt;code&gt;Continue&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-4---dodatkowe-ustawienia&#34;&gt;Krok 4 - dodatkowe ustawienia&#xA;&lt;/h3&gt;&lt;p&gt;Dla naszego wyboru nie ma tu żadnej dodatkowej konfiguracji.&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-5---podgląd-planowanych-zmian&#34;&gt;Krok 5 - podgląd planowanych zmian&#xA;&lt;/h3&gt;&lt;p&gt;Na tym ekranie dokonujemy zmiany usuwając dysk systemowy jako miejsce przechowywania danych na HDFSie. W &lt;code&gt;DN Data Directory&lt;/code&gt; usuwamy pierwszy wpis &lt;code&gt;/dfs/dn&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x211.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-6---uruchomienie-usług&#34;&gt;Krok 6 - uruchomienie usług&#xA;&lt;/h3&gt;&lt;p&gt;Proces powinien potrwać ok. minuty a stanem oczekiwanym jest &lt;code&gt;Status: Finished&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x214.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;krok-7---podsumowanie&#34;&gt;Krok 7 - podsumowanie&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x218.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h2&gt;&lt;p&gt;Otrzymujemy ekran z wykresami.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x229.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;uwagi&#34;&gt;Uwagi&#xA;&lt;/h2&gt;&lt;h3 id=&#34;monitorowanie---zmiana-progów-ostrzeżeń&#34;&gt;Monitorowanie - zmiana progów ostrzeżeń&#xA;&lt;/h3&gt;&lt;p&gt;Konfiguracja z dyskami dla przechowywania danych dla DN wielkości 2 GB to tylko PoC, właściwa wielkość powinna być wyrażona w jednostkach TB. Domyślnie &lt;code&gt;CM&lt;/code&gt; wyświetla ostrzeżenie/błąd, gdy jest mniej niż 5/10 GB wolnego miejsca na potrzeby HDFSa.&lt;/p&gt;&#xA;&lt;p&gt;Rozwiązanie tej niedogodności to zmiana wartości progowych monitu o małej ilości wolnej przestrzeni każdego DN.&lt;/p&gt;&#xA;&lt;h4 id=&#34;rozwiązanie-1---api&#34;&gt;Rozwiązanie 1 - API&#xA;&lt;/h4&gt;&lt;p&gt;Za pomocą API dokonujemy zmian dla dwóch grup (tworzą się domyślnie)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;hdfs-DATANODE-BASE&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;hdfs-DATANODE-1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PUT /api/v31/clusters/bigdatapassion/services/hdfs/roleConfigGroups/hdfs-DATANODE-BASE/config&#xA;{&#xA;  &amp;#34;items&amp;#34;: [&#xA;    {&#xA;      &amp;#34;name&amp;#34;: &amp;#34;datanode_data_directories_free_space_absolute_thresholds&amp;#34;,&#xA;      &amp;#34;value&amp;#34;: &amp;#34;{\&amp;#34;warning\&amp;#34;:1073741824,\&amp;#34;critical\&amp;#34;:536870912}&amp;#34;&#xA;    }&#xA;  ]&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;PUT /api/v31/clusters/bigdatapassion/services/hdfs/roleConfigGroups/hdfs-DATANODE-1/config&#xA;{&#xA;  &amp;#34;items&amp;#34;: [&#xA;    {&#xA;      &amp;#34;name&amp;#34;: &amp;#34;datanode_data_directories_free_space_absolute_thresholds&amp;#34;,&#xA;      &amp;#34;value&amp;#34;: &amp;#34;{\&amp;#34;warning\&amp;#34;:1073741824,\&amp;#34;critical\&amp;#34;:536870912}&amp;#34;&#xA;    }&#xA;  ]&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;rozwiązanie-2---webui&#34;&gt;Rozwiązanie 2 - WebUI&#xA;&lt;/h4&gt;&lt;p&gt;Z menu po lewej stronie wybieramy &lt;code&gt;Clusters&lt;/code&gt; a następnie nazwę naszego klastra, tu &lt;code&gt;bigdatalinux&lt;/code&gt;. Z menu &lt;code&gt;Configuration&lt;/code&gt; przechodzimy do &lt;code&gt;Configurationt Search&lt;/code&gt;. W polu wyszukiwania wyszukujemy &lt;code&gt;datanode directory free space&lt;/code&gt; - interesuje nas &lt;code&gt;DataNode Data Directory Free Space Monitoring Absolute Thresholds&lt;/code&gt;. W przeciwieństwie do poprzedniego rozwiązaniu tu można wykonać zmianę za pomocą zmiany parametrów jednocześnie dla dwóch grup. Wystarczy zapisać zmianę (z ewentualnym komentarzem) za pomocą &lt;code&gt;Ctrl+S&lt;/code&gt; i poczekać kilka minut za aktualizacją statusu.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0xf01.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;oczekiwany-stan&#34;&gt;Oczekiwany stan&#xA;&lt;/h4&gt;&lt;p&gt;Po wybraniu z menu &lt;code&gt;Clusters&lt;/code&gt; po lewej stronie roli &lt;code&gt;HDFS&lt;/code&gt; w pierwszej zakladce &lt;code&gt;Status&lt;/code&gt; ujrzymy wykres &lt;code&gt;Health&lt;/code&gt; wskazujący kiedy nastąpiła zmiana statusu.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/cloudera-manager-744/cloudera-manager-data-center-edition-bigdatapassion-pl-no-0x228.gif&#34;&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Umarł król, niech żyje król, czyli czym zastąpić dystrybucję Hortonworks</title>
            <link>https://bigdatapassion.pl/blog/umar%C5%82-kr%C3%B3l-niech-%C5%BCyje-kr%C3%B3l-czyli-czym-zast%C4%85pi%C4%87-dystrybucj%C4%99-hortonworks/</link>
            <pubDate>Mon, 28 Mar 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/umar%C5%82-kr%C3%B3l-niech-%C5%BCyje-kr%C3%B3l-czyli-czym-zast%C4%85pi%C4%87-dystrybucj%C4%99-hortonworks/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/platform/hortonworks-logo.png&#34; alt=&#34;Featured image of post Umarł król, niech żyje król, czyli czym zastąpić dystrybucję Hortonworks&#34; /&gt;&lt;p&gt;Przez długi czas, Hortonworks Data Platform oraz Hortonworks DataFlow były najpopularniejszymi dystrybucjami Big Data na świecie.&#xA;Ze względu na możliwość korzystania z platformy całkowicie za darmo bez potrzeby jakiejkolwiek rejestracji,&#xA;tak naprawdę nie wiadomo jako dużo projektów było o nią opartych, ale widząc choćby popularność w internecie w samej Polsce było ich sporo.&#xA;Niestety dla tych wszystkich firm i projektów, firma Hortonowrks już nie istnieje, zaś sama platforma nie jest już rozwijana.&lt;/p&gt;&#xA;&lt;p&gt;Stało się to za sprawą &lt;a class=&#34;link&#34; href=&#34;https://www.cloudera.com/about/news-and-blogs/press-releases/2019-01-03-cloudera-and-hortonworks-complete-planned-merger.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;połączenia&lt;/a&gt;&#xA;firmy Hortonworks z firmą Cloudera 1 stycznia 2019 roku.&lt;/p&gt;&#xA;&lt;p&gt;Od tamtego czasu minęły już ponad trzy lata, a mimo to wiele firm nadal korzysta z rozwiązań zbudowanych przez firmę Hortonworks&#xA;jak Hortonworks Data Platform oraz Hortonworks DataFlow.&lt;/p&gt;&#xA;&lt;p&gt;Przyczyn tego zjawiska jest wiele, najczęściej są to braki kadrowe, niechęć do ponoszenia nowych wydatków związanych z migracją,&#xA;trudność samej migracji, gdyż na obecnej platformie jest opartych wiele produkcyjnych systemów oraz po prostu trudność wyboru nowej platformy.&lt;/p&gt;&#xA;&lt;p&gt;Niestety 31 grudnia 2021 zakończył się okres &lt;a class=&#34;link&#34; href=&#34;https://endoflife.software/applications/big-data/hortonworks-data-platform-hdp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;wsparcia&lt;/a&gt;&#xA;dla platformy Hortonworks Data Platform, co oznacza, że najwyższy czas pomyśleć o migracji.&lt;/p&gt;&#xA;&lt;p&gt;Sytuacja jest o tyle ciekawsza, że także część serwisów chmurowych jest także oparta o wspomniane platformy jak na przykład:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Microsoft Azure HDInsight&lt;/li&gt;&#xA;&lt;li&gt;Oracle Cloud Big Data Service&lt;/li&gt;&#xA;&lt;li&gt;IBM Analytics Engine&lt;/li&gt;&#xA;&lt;li&gt;OVH Analytics Data Platform&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dlatego powyższym dostawcom usług chmurowych, jak i ich klientom, także będzie zależeć na zastąpieniu tych platform ich nowszymi wersjami.&lt;/p&gt;&#xA;&lt;p&gt;W artykule spróbuję wskazać kilka najpopularniejszych dróg migracji platform firmy Hortonworks.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Artykuł ten dedykuje Apache Ambari, które przez wiele lat pomagało budować, zarządzać i monitorować klastry Big Data.&#xA;Niestety jako integralna część platform firmy Hortonworks, 10 stycznia 2022 roku zdecydowano o zamrożeniu repozytorium kodu&#xA;i przekazaniu projektu do &lt;a class=&#34;link&#34; href=&#34;https://attic.apache.org/projects/ambari.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Attic&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;migracja-do-cloudera-data-platform&#34;&gt;Migracja do Cloudera Data Platform&#xA;&lt;/h3&gt;&lt;p&gt;Po połączeniu firmy Hortonworks wraz z firmą Cloudera podjęto decyzję, że firma udostępni swoim klientom swoją nową platformę,&#xA;która nazywa się Cloudera Data Platform (CDP).&#xA;W praktyce CDP jest to mocno rozwinięta wersja poprzedniej platformy firmy, czyli Cloudera Distribution for Hadoop (CDH)&#xA;gdzie dołożone kilka komponentów z dystrybucji Hortonworks jak np. Apache Ranger, który zastąpił Apache Sentry (także przekazane do Attic).&#xA;Porównanie funkcjonalności HDP z CDP można znaleźć &lt;a class=&#34;link&#34; href=&#34;https://www.cloudera.com/products/pricing/product-features.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tutaj&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Cloudera Data Platform jest dostępna w trzech wersjach:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;CDP Private Cloud Base - wersja &amp;ldquo;tradycyjna&amp;rdquo; oparta o maszyny fizyczne lub wirtualne, wersja najbliższa architekturą platformie HDP&lt;/li&gt;&#xA;&lt;li&gt;CDP Private Cloud - wersja oparta o klastry Kubernetes, obecnie wspierany jest Red Hat OpenShift (co może zostać rozszerzone w przyszłości)&lt;/li&gt;&#xA;&lt;li&gt;CDP Public Cloud - wersja dla firm chcących korzystać z platformy Cloudery w chmurze na zasobach AWS, GCP lub Azure, jest to gotowy serwis zarządzany przez Clouderę&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dużym plusem dla użytkowników Hortonworks Data Platform (oraz także CDH) jest przygotowany i udokumentowany proces &lt;a class=&#34;link&#34; href=&#34;https://docs.cloudera.com/cdp-private-cloud-upgrade/latest/upgrade-hdp3/topics/amb3-hdp-cdp-upg.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;migracji&lt;/a&gt; do CDP zarówno z wersji 2.x oraz najnowszej 3.x.&lt;/p&gt;&#xA;&lt;p&gt;Dużą różnicą w stosunku do dystrybucji Hortonworks jest konieczność zakupu licencji, około 10 tysięcy dolarów rocznie za serwer,&#xA;chętnych odsyłam do &lt;a class=&#34;link&#34; href=&#34;https://www.cloudera.com/products/pricing.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;cennika&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;migracja-do-konkurencyjnej-platformy&#34;&gt;Migracja do konkurencyjnej platformy&#xA;&lt;/h3&gt;&lt;p&gt;Cloudera nie jest jedyną firmą, która postanowiła ułatwiać firmom pracę z technologiami Big Data, dlatego też można rozważyć skorzystanie z oferty innej firmy.&#xA;Oczywiście oferty tych firm są różne i nie stanowią kompletu funkcjonalności Cloudera Data Platform&#xA;lub niekiedy musimy skorzystać z kilku, by zrealizować wszystkie wymagania naszego biznesu.&lt;/p&gt;&#xA;&lt;p&gt;Najbliższym rozwiązaniem może okazać się &lt;a class=&#34;link&#34; href=&#34;https://www.hpe.com/pl/pl/software/ezmeral-data-fabric.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;HPE Ezmeral Data Fabric&lt;/a&gt;.&#xA;Osoby dłużej związane z rynkiem Big Data mogą tę platformę kojarzyć pod wcześniejszą nazwą, czyli &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/MapR&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;MapR&lt;/a&gt;,&#xA;gdyż Hewlett Packard Enterprise ogłosił 5 sierpnia 2019 kupno firmy MapR Technologies i jej platformy.&#xA;W przypadku tej platformy także możemy wybrać instalację w oparciu o maszyny fizyczne bądź wirtualne oraz także klaster Kubernetes.&#xA;Możemy także skorzystać z oferty &amp;ldquo;private cloud&amp;rdquo; od HPE zwanej &lt;a class=&#34;link&#34; href=&#34;https://www.hpe.com/us/en/greenlake/big-data.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;GreenLake&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Do innych popularnych platform z obszaru Big Data należą między innymi:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/product/confluent-platform/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Confluent Platform&lt;/a&gt; - gdy potrzebujemy klastrów Apache Kafka&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.ververica.com/platform&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Ververica Platform&lt;/a&gt; - jeśli chcemy oprzeć nasz streaming o Apache Flink&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.starburst.io/platform/starburst-enterprise/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Starburst Enterprise&lt;/a&gt; - dla firm korzystających z Trino&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elastic.co/elastic-stack/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Elastic Stack&lt;/a&gt; - gdy interesuje nas enterprise search i podobne zastosowania, w tym także wizualizacja&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.datastax.com/products/datastax-enterprise&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;DataStax Enterprise&lt;/a&gt; - platforma oparta o Apache Cassandra, klastry Kubernetes oraz Apache Pulsar (Luna Streaming)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;własna-platforma&#34;&gt;Własna platforma&#xA;&lt;/h3&gt;&lt;p&gt;Platformy firmy Hortonworks nie były tylko darmowe, ale także w stu procentach otwartoźródłowe.&#xA;Biorąc to pod uwagę, możemy rozważyć także budowę własnej platformy, wykorzystując popularne narzędzia jak Hadoop, Spark, Kafka, Flink czy Airflow.&#xA;Zarządzanie taką platformą, zamiast Ambari i Cloudera Manager, możemy oprzeć o popularne narzędzia takie jak Ansible lub Puppet.&lt;/p&gt;&#xA;&lt;p&gt;Do zbudowania własnej dystrybucji, możemy także skorzystać z bazowej dystrybucji &lt;a class=&#34;link&#34; href=&#34;https://bigtop.apache.org/release-notes.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Apache Bigtop&lt;/a&gt;.&#xA;Na jej podstawie powstaje choćby bardzo popularny &lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-release.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AWS EMR&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ta droga likwiduje potrzebę kupowania drogich licencji i wsparcia, jednak wymaga zbudowania zgranego zespołu specjalistów,&#xA;którzy stworzą i utrzymają taką własną platformę Big Data.&lt;/p&gt;&#xA;&lt;h3 id=&#34;chmura-publiczna&#34;&gt;Chmura publiczna&#xA;&lt;/h3&gt;&lt;p&gt;Jednym z popularnych trendów, zwłaszcza w platformach analitycznych, jest migracja do chmury publicznej.&#xA;Każdy z większych dostawców chmurowych udostępnia szereg natywnych rozwiązań big data, w tym data science i machine learning.&#xA;Sprawia to, że praca z danymi w chmurze jest prosta, szybka i przyjemna.&#xA;Dodatkowo chmury oferują niezwykłą dostępność zasobów, niespotykaną wręcz w środowiskach on premise, gdzie na dodatkowy sprzęt możemy czekać niekiedy miesiącami.&#xA;Chmura potrafi także być tańsza, szczególnie przez korzystanie z automatycznej skalowalności i płatności tylko za użyte zasoby w czasie.&#xA;Nie musimy inwestować na start w olbrzymi klaster kilkudziesięciu maszyn i poświęcać wielu tygodni lub miesięcy na jego wdrożenie w organizacji,&#xA;lecz od pierwszych chwil możemy zająć się już realną pracą z danymi.&#xA;Nie musimy także zaczynać od nie wiadomo jak dużych wolumenów danych, by nam się opłacało sięgać po te technologie,&#xA;gdyż próg wejścia jest wyjątkowo niski w chmurze publicznej.&lt;/p&gt;&#xA;&lt;p&gt;W chmurze możemy korzystać z dystrybucji Big Data takich jak &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/emr/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Amazon EMR&lt;/a&gt; czy &lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/dataproc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Google Dataproc&lt;/a&gt;&#xA;rozwijanych przez dostawców chmurowych oraz także dystrybucji firm trzecich jak &lt;a class=&#34;link&#34; href=&#34;https://databricks.com/glossary/unified-data-analytics-platform&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Databricks&amp;rsquo; Unified Data Analytics Platform&lt;/a&gt;&#xA;stworzoną przez firmę Databricks i dostępną w AWS, GCP oraz Azure.&#xA;Należy jednak pamiętać, że część serwisów Big Data, jak np. Azure HDInsight bazuje na rozwiązaniach Hortonworks,&#xA;dlatego jako nowy klient, lepiej skorzystać z alternatywnych rozwiązań.&lt;/p&gt;&#xA;&lt;p&gt;Więcej o zaletach pracy z danymi w chmurze można znaleźć &lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/events/nlpday-2020-presentation/&#34; &gt;w mojej prezentacji&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;docker-i-kubernetes&#34;&gt;Docker i Kubernetes&#xA;&lt;/h3&gt;&lt;p&gt;Na koniec jeden z najnowszych trendów, czyli wykorzystanie projektów takich jak Docker i Kubernetes do budowy własnej platformy analitycznej.&#xA;Do tej pory większość dystrybucji Big Data była oparta o maszyny fizyczne lub wirtualne.&#xA;Jednak w erze niesamowitej popularyzacji kontenerów, coraz więcej rozwiązań IT jest przenoszonych do tego świata.&#xA;Tak też się dzieje z technologiami Big Data.&lt;/p&gt;&#xA;&lt;p&gt;Dobrym przykładem jest firma Uber, która &lt;a class=&#34;link&#34; href=&#34;https://eng.uber.com/hadoop-container-blog/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;przeniosła&lt;/a&gt; swój Data Lake oparty o Apache Hadoop do kontenerów.&#xA;Także twórcy wielu popularnych narzędzi Big Data jak &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/running-on-kubernetes.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Spark&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/native_kubernetes/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Flink&lt;/a&gt; lub &lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/kafka-summit-sf18/deploying-kafka-streams-applications/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Kafka Streams&lt;/a&gt; wspierają pracę na klastrach Kubernetes.&#xA;Wspomniane wcześniej komercyjne platformy Big Data jak &lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AWS EMR&lt;/a&gt; lub &lt;a class=&#34;link&#34; href=&#34;https://www.cloudera.com/about/news-and-blogs/press-releases/2020-04-28-cloudera-selects-red-hat-openshift.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Cloudera Data Platform&lt;/a&gt; są dostępne zarówno w wersji opartej o klasyczne wdrożenie na maszyny wirtualne / fizyczne jak i w oparciu o Kubernetes.&#xA;Databricks, czyli firma stojąca za rozwojem Apache Spark, swoją bardzo popularną platformę chmurową w wersji Google Cloud oparła o &lt;a class=&#34;link&#34; href=&#34;https://databricks.com/blog/2021/08/06/how-we-built-databricks-on-google-kubernetes-engine-gke.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Google Kubernetes Engine&lt;/a&gt;.&#xA;Także ich najnowsza usługa, czyli &lt;a class=&#34;link&#34; href=&#34;https://databricks.com/blog/2021/08/30/announcing-databricks-serverless-sql.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Databricks Serverless SQL&lt;/a&gt;, jest oparta o &lt;a class=&#34;link&#34; href=&#34;https://docs.databricks.com/serverless-compute/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Amazon Elastic Kubernetes Service (EKS)&lt;/a&gt; (w momencie pisania artykułu serverless SQL jest dostępny jako preview tylko w chmurze AWS).&lt;/p&gt;&#xA;&lt;h3 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h3&gt;&lt;p&gt;Jak widać powyżej, połączenie się firm Hortonworks i Cloudera zmusiło wiele firm do przemyślenia na nowo swojego podejścia do budowy platformy analitycznej.&#xA;Na szczęście, możliwości rynek oferuje sporo, powyżej wymieniłem w skrócie 5 najpopularniejszych kierunków widocznych w polskim i światowym community.&#xA;Każda z powyższych ścieżek niesie z sobą pewne zalety i wady, ostateczną decyzję zatem każda firma będzie musiała podjąć samodzielnie na podstawie swoich potrzeb i możliwości.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Big Data Technology Warsaw Summit 2022</title>
            <link>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2022/</link>
            <pubDate>Wed, 23 Mar 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2022/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/big-data-technology-summit-warsaw-2022.jpg&#34; alt=&#34;Featured image of post Big Data Technology Warsaw Summit 2022&#34; /&gt;&lt;p&gt;Miło nam poinformować, że Big Data Technology Warsaw Summit powraca do Warszawy!&lt;/p&gt;&#xA;&lt;p&gt;W tym roku konferencja będzie dostępna w dwóch odsłonach, stacjonarnej w Warszawie dla tych co chcieliby się spotkać twarzą w twarz (także z nami)&#xA;oraz wersję online dla tych którzy nie mogą przybyć osobiście.&lt;/p&gt;&#xA;&lt;p&gt;Dlaczego warto uczestniczyć w Big Data Technology Warsaw Summit onsite/online?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;To jedyna w Polsce tak duża technologiczna i międzynarodowa konferencja, skupiona na dużych danych&lt;/li&gt;&#xA;&lt;li&gt;Prelegenci to wybitni eksperci z Polski i zagranicy – inżynierowie, architekci, deweloperzy. Podzielą się doświadczeniem zdobytym przy wyjątkowo ciekawych projektach – m.in. w takich firmach jak: Allegro, Apple, Bank Millennium, eBay, Google Cloud, Microsoft, OLX Group, Philip Morris International, Reckitt, Ringier Axel Springer Polska, T-Mobile PL, Vertica, Zalando.&lt;/li&gt;&#xA;&lt;li&gt;Konferencja jest w najwyższym stopniu praktyczna i technologiczna. Poznacie case studies oraz najnowsze rozwiązania w takich dziedzinach jak:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Architecture Operations &amp;amp; Cloud&lt;/li&gt;&#xA;&lt;li&gt;Data Strategy and Roi&lt;/li&gt;&#xA;&lt;li&gt;Data Engineering&lt;/li&gt;&#xA;&lt;li&gt;AI and Data Science&lt;/li&gt;&#xA;&lt;li&gt;Real-Time Streaming&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Big Data Technology Warsaw Summit przyciąga rokrocznie ponad 500 uczestników - profesjonalistów od dużych danych.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Z kodem „springitup” specjalna zniżka :)&lt;/strong&gt; (tylko do końca marca)&lt;/p&gt;&#xA;&lt;p&gt;Osobiście też się wybieram, dlatego do zobaczenia w kwietniu w Warszawie lub online! :)&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Big Data Technology Warsaw Summit 2022</title>
            <link>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2022/</link>
            <pubDate>Wed, 09 Mar 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2022/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/big-data-technology-summit-warsaw-workshops-2022.jpg&#34; alt=&#34;Featured image of post Big Data Technology Warsaw Summit 2022&#34; /&gt;&lt;p&gt;Z wielką przyjemnością zapraszamy na trzy darmowe webinary organizowane przed Big Data Technology Warsaw Summit 2022 :)&lt;/p&gt;&#xA;&lt;p&gt;Prezentacje zapowiadają się bardzo ciekawie, w tym takie tematy jak:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Apache Kafka and Flink: Stateful Streaming Data Pipelines made easy with SQL by Francesco Tisiot, Developer Advocate, Aiven&lt;/li&gt;&#xA;&lt;li&gt;Flink&amp;rsquo;s Table &amp;amp; DataStream API: A Perfect Symbiosis by Timo Walther Staff Engineer, Ververica&lt;/li&gt;&#xA;&lt;li&gt;Tweet-Topic Classification: The Real-Life Perspective by Mateusz Fedoryszak ML Engineer, Twitter&lt;/li&gt;&#xA;&lt;li&gt;No-code ML predictions in real-time with ksqlDB and MLeap by Mariusz Strzelecki Senior Machine Learning Engineer, GetInData&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Webinaria odbędą się 15 i 22 marca oraz 8 kwietnia. Podczas każdego spotkania będzie można wziąć udział w naszym konkursie i wygrać zaproszenie na Big Data Technology Summit 2022 oraz dostęp do nagrań z ostatniej edycji!&lt;/p&gt;&#xA;&lt;p&gt;Zapraszam do &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/webinar-online/?utm_source=meetup&amp;amp;utm_medium=event&amp;amp;utm_campaign=BDPASSION_202203&amp;amp;utm_id=getindata&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rejestracji&lt;/a&gt; :)&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Historia powstaja jednego z najważniejszych projektów ostatnich lat, czyli Kubernetes!</title>
            <link>https://bigdatapassion.pl/blog/historia-powstaja-jednego-z-najwa%C5%BCniejszych-projekt%C3%B3w-ostatnich-lat-czyli-kubernetes/</link>
            <pubDate>Wed, 02 Feb 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/historia-powstaja-jednego-z-najwa%C5%BCniejszych-projekt%C3%B3w-ostatnich-lat-czyli-kubernetes/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/platform/kubernetes.png&#34; alt=&#34;Featured image of post Historia powstaja jednego z najważniejszych projektów ostatnich lat, czyli Kubernetes!&#34; /&gt;&lt;p&gt;Kubernetes to jeden z ważniejszych projektów ostatnich czasów.&#xA;Jest istotny zarówno dla osób pracujących w on premise jak i w chmurze publicznej. Dla wielu jest to wręcz idealne narzędzie do stworzenia tak zwanej &amp;ldquo;chmury prywatnej&amp;rdquo;.&#xA;Używany zarówno w rozwoju własnych aplikacji jak i coraz częściej jest podstawą dla rozwiązań Big Data!.&#xA;W wielu firmach, tam gdzie tylko się da, kontenery uruchamiane z pomocą Kubernetes zastępują wirtualizację.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli interesuje Was jak doszło do powstania tego projektu, poniżej dwuczęściowy film dokumentacyjny, gorąco polecam :)&lt;/p&gt;&#xA;&lt;p&gt;Część 1:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/BE77h7dmoQU&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Część 2:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/318elIq37PE&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Czego uczyć się w 2022 roku by zostać inżynierem danych</title>
            <link>https://bigdatapassion.pl/blog/czego-uczy%C4%87-si%C4%99-w-2022-roku-by-zosta%C4%87-in%C5%BCynierem-danych/</link>
            <pubDate>Mon, 17 Jan 2022 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/czego-uczy%C4%87-si%C4%99-w-2022-roku-by-zosta%C4%87-in%C5%BCynierem-danych/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/misc/what-to-learn-to-become-data-engineer-in-2022.jpg&#34; alt=&#34;Featured image of post Czego uczyć się w 2022 roku by zostać inżynierem danych&#34; /&gt;&lt;p&gt;Rynek analityki danych, szczególnie tej &amp;ldquo;wielkogabarytowej&amp;rdquo; jest jeszcze dość młodą działką w IT.&#xA;Jest to też coraz bardziej strategiczny rynek dla wielu firm inwestujących w niego coraz większe pieniądze.&#xA;Skutkiem tego rynek coraz szybciej się zmienia, powstaje coraz więcej narzędzi mających zaspokoić rosnące potrzeby firm oraz wzrasta także zapotrzebowanie na specjalistów potrafiących z nich korzystać, co w IT wcale nie jest takie proste, o czym wie każdy kto ma kontakt z tą branżą.&#xA;Pojawia się zatem pytanie, co należy umieć by zacząć swoją pracę z analityką danych.&#xA;W artykule skupimy się na jednym z częściej poszukiwanych specjalistów, czyli inżynierem danych (data engineer).&lt;/p&gt;&#xA;&lt;h3 id=&#34;naucz-się-programować&#34;&gt;Naucz się programować&#xA;&lt;/h3&gt;&lt;p&gt;Na pierwszym miejscu, dość nietypowo w stosunku do większości poradników w internecie, wskażę umiejętność programowania.&#xA;Oczywiście od lat mówi się, że programista zostanie zastąpiony przez wyspecjalizowane algorytmy które będą generować same kod na życzenie biznesu, ale nadal umiejętność programowania, jest jedną z podstawowych które musi zdobyć inżynier danych. Najbardziej podstawowym i powszechnym językiem &amp;ldquo;programowania&amp;rdquo; jest oczywiście SQL. W świecie analizy danych jego rola jest dużo większa niż komuś z innego obszaru IT mogłoby się wydawać, gdyż poza standardowym i popularnym zastosowaniem do komunikacji z bazami danych, także tymi NoSQL powszechnie używanymi tutaj, jest on także używany to pracy z takimi narzędziami jak np. Hive, Presto, Trino, Spark, Flink czy Kafka (ksqlDB).&lt;/p&gt;&#xA;&lt;p&gt;Dodatkowo warto znać przynajmniej jeden z języków programowania ogólnego zastosowania. Wśród osób zajmujących się data science lub uczeniem maszynowym króluje oczywiście język Python jeśli chodzi o popularność, jednak inżynierowie danych bardzo często sięgają także po język Scala oraz Java. Oczywiście można spotkać oferty wymagające znajomości innych języków jak choćby Go, R, C++, Kotlin, Groovy, C# czy JavaScript ale zdecydowanie najpopularniejszymi są Python, Scala oraz Java.&lt;/p&gt;&#xA;&lt;p&gt;Niestety poznanie składni języka to zdecydowanie za mało. By zostać programistą należy jeszcze mieć wiedzę o takich aspektach wytwarzania kodu jak algorytmy i struktury danych, czysty kod, wzorce projektowe czy testowanie kodu. Niezwykle przydatna będzie też znajomość jakiegoś środowiska programistycznego (np. IntelliJ IDEA, PyCharm, Visual Studio Code), notebooków data science (np. Jupyter, Zeppelin) czy umiejętność korzystania z systemu kontroli wersji (np. Git).&lt;/p&gt;&#xA;&lt;h3 id=&#34;poznaj-swoje-narzędzia&#34;&gt;Poznaj swoje narzędzia&#xA;&lt;/h3&gt;&lt;p&gt;Inżynierowie danych w swojej pracy korzystają z wielu narzędzi ułatwiających pracę z danymi, dlatego ich poznanie jest bardzo ważne i cenne dla pracodawców.&#xA;Patrząc na rozwój tych narzędzi, można zauważyć pewne ery rozkwitania i popularyzacji różnych narzędzi. Wszystko zaczęło się od rozwiązania jakim jest Apache Hadoop który do dzisiaj jest podstawą większości platform Big Data (mam tutaj na myśli komponenty HDFS i YARN). Drugim narzędziem które zdobyło rynek jest Apache Spark, jest to najprawdopodobniej najczęściej wymieniana technologia w ofertach dla inżynierów Big Data. Po erze przetwarzania wsadowego (batch) przyszła kolej na rozwój narzędzi przetwarzania strumieniowego i tak na dobre zagościła w ofertach pracy Apache Kafka a niedługo później coraz częściej firmy zaczęły poszukiwać inżynierów znających także Apache Flink. W ostatnim czasie do narzędzi wiodących prym w ofertach pracy dołączył także Apache Airflow. Znając te 5 narzędzi, będziemy mogli złożyć CV na większość ofert inżyniera danych.&lt;/p&gt;&#xA;&lt;p&gt;Chcąc swobodnie poruszać się w obszarze danych, należy dobrze poznać także narzędzia w których te dane będą się znajdować. Oczywiście podstawowym miejscem składowania naszych dużych zbiorów danych będzie w większości przypadkach Data Lake (np. HDFS, Amazon S3, Google Cloud Storage, Azure Data Lake). Coraz częściej rozszerza się możliwości jezior danych wykorzystując rozwiązania takie jak Apache Iceberg, Delta Lake lub Apache Hudi. Praktycznie każda większa firma będzie korzystać także z hurtowni danych, dlatego znajomość tego typu narzędzi może się okazać dużym plusem dla naszego przyszłego pracodawcy. Skoro najpopularniejszym językiem w IT jest od dawna język SQL, nie sposób zapomnieć o bazach danych, zarówno tych klasycznych, relacyjnych jak również rozwiązań NoSQL jak Cassandra, HBase, Redis czy MongoDB.&lt;/p&gt;&#xA;&lt;h3 id=&#34;chmura-obliczeniowa-to-przyszłość&#34;&gt;Chmura obliczeniowa to przyszłość&#xA;&lt;/h3&gt;&lt;p&gt;Adopcja chmury w Polsce stawia nas niestety w końcówce wszelkich europejskich rankingów, jednak większość specjalistów uważa, że dogonienie zagranicznych rynków to tylko kwestia czasu, zaś znajomość chmury publicznej to obecnie jedna z najczęściej poszukiwanych umiejętności na rynku pracy. Oczywiście trzeba się liczyć z tym, że pracując dla polskiej firmy, nasz kontakt z chmurą będzie jeszcze dość ograniczony, jednak tempo rozwoju rozwiązań chmurowych i mnogość dostępnych tam narzędzi sprawia, że im wcześniej poznamy możliwości chmury publicznej tym łatwiej nam będzie znaleźć wymarzoną posadę w przyszłości.&lt;/p&gt;&#xA;&lt;p&gt;Trzeba tutaj zaznaczyć, że w chmurze spotkamy zarówno rozwiązania dobrze nam znane z platform onpremise jak Spark, Kafka czy Airflow które będą przez dostawców dostosowane do pracy w środowisku chmury publicznej, oraz także spotkamy tutaj konkurencyjne natywne narzędzia jak np. zamiast HDFS będziemy budować nasze jezioro danych w oparciu o Amazon S3, Google Cloud Storage lub Azure Data Lake zaś zamiast Kafki będziemy mogli wybrać Amazon Kinesis lub Google Pub/Sub. Należy tutaj wspomnieć także, że oprócz rozwiązań od czołowych dostawców takich jak Amazon Web Services, Google Cloud Platform lub Microsoft Azure coraz częściej firmy sięgają po rozwiązania firm trzecich dostępnych w chmurze publicznej jak np. Snowflake lub Databricks Unified Data Analytics Platform (obydwa narzędzia dostępne są w chmurze AWS, GCP oraz Azure).&lt;/p&gt;&#xA;&lt;h3 id=&#34;konteneryzacja-to-już-codzienność&#34;&gt;Konteneryzacja to już codzienność&#xA;&lt;/h3&gt;&lt;p&gt;Przez długi czas konteneryzacja była kojarzona z dostarczaniem aplikacji, np. mikroserwisów. Od jakiegoś czasu jednak dla wielu firm kontenery to podstawa działania, zaś Docker i Kubernetes stały się bardziej strategicznym środowiskiem niż maszyny wirtualne. Coraz częściej słyszy się, że firmy migrują swoje platformy Big Data w części lub całości na Kubernetes. Oczywiście dzieje się to dzięki temu, że twórcy popularnych rozwiazań Big Data jak &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/running-on-kubernetes.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Spark&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/native_kubernetes/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Flink&lt;/a&gt; lub &lt;a class=&#34;link&#34; href=&#34;https://www.confluent.io/kafka-summit-sf18/deploying-kafka-streams-applications/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Kafka Streams&lt;/a&gt; wspierają takie wdrażanie. Także duzi dostawcy platform Big Data jak &lt;a class=&#34;link&#34; href=&#34;https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AWS&lt;/a&gt; lub &lt;a class=&#34;link&#34; href=&#34;https://www.cloudera.com/about/news-and-blogs/press-releases/2020-04-28-cloudera-selects-red-hat-openshift.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Cloudera&lt;/a&gt; umożliwili pracę ze swoimi platformami Big Data zarówno w wersji opartej o klasyczne wdrożenie na maszyny wirtualne / fizyczne jak i w oparciu o Kubernetes.&lt;/p&gt;&#xA;&lt;h3 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h3&gt;&lt;p&gt;Powyżej, w czterech akapitach, wymieniłem najważniejsze (oczywiście moim zdaniem) obszary w których powinien rozwijać się inżynier chcący swobodnie pracować z danymi. Oczywiście w ofertach pracy dla inżynierów danych będą pojawiać się także inne wymagania tutaj pominięte, jednak w mojej ocenie, obserwując rynek zarówno od strony ofert pracy jak i kierunku w jakie idą firmy w Polsce i na świecie, te cztery obszary są kluczowe.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Raport AI@Enterprise 2021!</title>
            <link>https://bigdatapassion.pl/blog/raport-ai@enterprise-2021/</link>
            <pubDate>Mon, 07 Jun 2021 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/raport-ai@enterprise-2021/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/aI-enterprise-report-2021.jpg&#34; alt=&#34;Featured image of post Raport AI@Enterprise 2021!&#34; /&gt;&lt;p&gt;Poszukujesz informacji na temat zastosowania sztucznej inteligencji w biznesie?&lt;/p&gt;&#xA;&lt;p&gt;Pobierz najnowszy Raport AI@Enterprise 2021! Gorąco polecamy!&lt;/p&gt;&#xA;&lt;p&gt;Dzięki lekturze Raportu:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Zobaczysz na konkretnych przykładach, z jakimi wyzwaniami wiąże się wdrażanie rozwiązań wykorzystujących sztuczną inteligencję.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Poznasz doświadczenia ekspertów, którzy mają już za sobą realizację projektów dotyczących wykorzystania technologii AI w organizacjach z różnych branż.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Dowiesz się jak w praktyce wyglądają korzyści z wdrożeń AI i z jakimi barierami w ich realizacji można się spotkać.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Link do pobrania tutaj: &lt;a class=&#34;link&#34; href=&#34;https://aisummit.today/aie-raport2021/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://aisummit.today/aie-raport2021/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Nie przegap tej publikacji&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>AI@Enterprise Summit 2021</title>
            <link>https://bigdatapassion.pl/blog/ai@enterprise-summit-2021/</link>
            <pubDate>Fri, 04 Jun 2021 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/ai@enterprise-summit-2021/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/aI-enterprise-summit-2021.jpg&#34; alt=&#34;Featured image of post AI@Enterprise Summit 2021&#34; /&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://aisummit.today/agenda/?utm_source=patronr&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B01_05.2021&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Jak jeszcze lepiej wykorzystać możliwości sztucznej inteligencji w biznesie?&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://aisummit.today/agenda/?utm_source=patronr&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B01_05.2021&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Dowiedz się podczas AI@Enterprise Summit 2021 – 9-10 czerwca, online!&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sztuczna inteligencja coraz mocniej wkracza do świata biznesu, zmieniając sposób pracy firm i umożliwiając powstanie całkowicie nowych usług i modeli biznesowych. Jest to możliwe dzięki kilku czynnikom: rozwoju technologii Big Data, rosnącej popularności rozwiązań chmurowych, automatyzacji oraz przyspieszającej transformacji cyfrowej.&lt;/p&gt;&#xA;&lt;p&gt;Czas zacząć czerpać korzyści z zastosowania sztucznej inteligencji w praktyce!&lt;/p&gt;&#xA;&lt;p&gt;Zapraszamy do udziału w konferencji AI@Enterprise Summit 2021!&lt;/p&gt;&#xA;&lt;p&gt;Będzie to spotkanie zarówno dla specjalistów od danych, jak i programistów, ekspertów machine learning, inżynierów DevOps, managerów, którzy chcą wdrażać rozwiązania AI w swoich firmach.&lt;/p&gt;&#xA;&lt;h3 id=&#34;dlaczego-warto-wziąć-udział-w-ai--enterprise-summit-2021&#34;&gt;Dlaczego warto wziąć udział w AI @ Enterprise Summit 2021?&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;spotykasz się z ponad 50 ekspertami AI z całego świata - wizjonerami i ekspertami, którzy pracują w największych światowych firmach!&lt;/li&gt;&#xA;&lt;li&gt;wybierzesz dla siebie najciekawsze tematy z 3 praktycznych ścieżek, które obejmują najważniejsze, aktualne aspekty sztucznej inteligencji!&lt;/li&gt;&#xA;&lt;li&gt;Podczas dyskusji roundtable wymienisz się doświadczeniami z innymi  uczestnikami wydarzenia&lt;/li&gt;&#xA;&lt;li&gt;Rozwiniesz swoje umiejętności podczas warsztatów - czekają na Ciebie 4 warsztaty techniczne i praktyczne!&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;swoimi-doświadczeniami-podzielą-się-znakomici-praktycy-sztucznej-inteligencji&#34;&gt;Swoimi doświadczeniami podzielą się znakomici praktycy sztucznej inteligencji!&#xA;&lt;/h3&gt;&lt;p&gt;Wystąpią m.in.:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Building End-to-End Machine Learning Workflows with Kubernetes, Kubeflow Pipelines, and BERT - Antje Barth, Amazon Web Services (AWS)&lt;/li&gt;&#xA;&lt;li&gt;10 biggest mistakes when creating AI products - Jaekob Chenina, Scuba Analytics&lt;/li&gt;&#xA;&lt;li&gt;Better Understand Your Documents with AI - Elliott (Feng) Ning, Google&lt;/li&gt;&#xA;&lt;li&gt;Finding duplicate images made easy in python with imagededup - Tanuj Jain, Axel Springer AG&lt;/li&gt;&#xA;&lt;li&gt;Scalable AI deployment on the edge - Maurits Kaptein, Tilburg University, Scailable&lt;/li&gt;&#xA;&lt;li&gt;Text Summarization with Transformer Models – Exploring New Frontiers in NLP - Nataliia Kees, qdive GmbH&lt;/li&gt;&#xA;&lt;li&gt;AI methods for predictive maintenance in production processes - Prof. Dr. Thomas Kopinski, University of South Westphalia&lt;/li&gt;&#xA;&lt;li&gt;Implementing a ML data product for lead management with focus of the insurance industry - Nina Meinel, Syncier Analytics&lt;/li&gt;&#xA;&lt;li&gt;Production-grade ML Pipelines - From Data To Metadata - Jörg Schad, ArangoDB&lt;/li&gt;&#xA;&lt;li&gt;Bigdata, ML &amp;amp; AI Fundamentals for Managers – A pragmatic view beyond hype! - Samuel Rostam, New York Institute of Technology, Arcitura Education&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Jeszcze możecie dokonać bezpłatnej rejestracji, ale szybko kończą się bezpłatne miejsca!&lt;/p&gt;&#xA;&lt;p&gt;Szczegóły dotyczące udziału znajdziecie &lt;a class=&#34;link&#34; href=&#34;https://aisummit.today/registration/?utm_source=patronr&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B01_05.2021&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;na stronie&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jesteśmy patronem wydarzenia dlatego spotkamy się na AI@E Summit 2021! Do zobaczenia!&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Big Data Technology Warsaw Summit 2021</title>
            <link>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2021/</link>
            <pubDate>Mon, 25 Jan 2021 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2021/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/big-data-technology-summit-warsaw-2021.jpg&#34; alt=&#34;Featured image of post Big Data Technology Warsaw Summit 2021&#34; /&gt;&lt;p&gt;Już niebawem dla wszystkich specjalistów Big Data, Data Science oraz inżynierii danych najlepsza okazja w roku - duża międzynarodowa konferencja &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/?utm_source=patron&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B02_01.2021&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Big Data Technology Warsaw Summit 2021&lt;/a&gt; odbędzie się 25-26 lutego 2021, w formule online!&lt;/p&gt;&#xA;&lt;p&gt;Nie możesz tego przegapić!&lt;/p&gt;&#xA;&lt;p&gt;Prelegenci  Big Data Technology Warsaw Summit to wybitni fachowcy – inżynierowie, architekci, deweloperzy z Polski oraz zagranicy.&lt;/p&gt;&#xA;&lt;p&gt;Swoimi doświadczeniami podzielą się m.in.:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Foundations of Data Teams - Jesse Anderson, Data Engineer, Creative Engineer and Managing Director, Big Data Institute&lt;/li&gt;&#xA;&lt;li&gt;Make it personal: reinforcement learning for mere mortals - Konrad Banachewicz, Lead Data Scientist, eBay Classifieds Group&lt;/li&gt;&#xA;&lt;li&gt;Lessons from building large-scale, real-time machine learning systems - Boxun Zhang, Data Science Lead, Unity&lt;/li&gt;&#xA;&lt;li&gt;How to build a state-of-the-art weather forecasting AI service - Axel Karlsson, AI Research Engineer, Peltarion&lt;/li&gt;&#xA;&lt;li&gt;Data Quality with 100+ PB: Solved Challenge at Criteo - Alexandre Terrien, Data Engineer, Criteo; Lucie Bailly, Lead Data Engineer, Criteo&lt;/li&gt;&#xA;&lt;li&gt;Telecom systems Degradation Prediction using ML - Shivendra Upadhyay, Senior Data Scientist, Ericsson R&amp;amp;D&lt;/li&gt;&#xA;&lt;li&gt;MLOps journey in H&amp;amp;M - Keven(Qi) Wang, Competence lead , Machine learning engineer, H&amp;amp;M&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Konferencja jest praktyczna i technologiczna – towarzyszą jej &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/?utm_source=patron&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B02_01.2021&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;dwa dni warsztatów do wyboru&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Real-Time stream processing - Grzegorz Kołakowski oraz Adrian Bednarz z GetInData&lt;/li&gt;&#xA;&lt;li&gt;Big Data on Kubernetes - Maciej Bryński z DXC Technology&lt;/li&gt;&#xA;&lt;li&gt;Foundations of data engineering with Google Cloud  - Mateusz Pytel z GetInData&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dołącz do uczestników konferencji i skorzystaj z promocji przy rejestracji do 5 lutego!&lt;/p&gt;&#xA;&lt;p&gt;Z kodem „bigdatapassion” otrzymasz 10% rabatu na udział w konferencji!&lt;/p&gt;&#xA;&lt;p&gt;Wszystkie informacje znajdziesz &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/?utm_source=patron&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B02_01.2021&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;na stronie&lt;/a&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Politechnika Warszawska i nowoczesne technologie w AWS!</title>
            <link>https://bigdatapassion.pl/blog/politechnika-warszawska-i-nowoczesne-technologie-w-aws/</link>
            <pubDate>Thu, 17 Dec 2020 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/politechnika-warszawska-i-nowoczesne-technologie-w-aws/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/news/politechnika-warszawska-i-nowoczesne-technologie-w-aws.png&#34; alt=&#34;Featured image of post Politechnika Warszawska i nowoczesne technologie w AWS!&#34; /&gt;&lt;p&gt;Na kanale YouTube &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/channel/UCkVjQGf_e0JmlonPMS4VNXQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AWS Polska&lt;/a&gt; pojawiła się moja rozmowa z Tomkiem Stachlewskim o tym jak wykorzystujemy nowoczestne technologie chmurowe w nauczaniu Big Data na Politechnice Warszawskiej.&lt;/p&gt;&#xA;&lt;p&gt;Zachęcam do obejrzenia :)&lt;/p&gt;&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/OC2Mv5Rzzk0&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;</description>
        </item><item>
            <title>Od Data Lake do AI czyli jak zdobyć wierzchołek góry lodowej z pomocą chmury publicznej</title>
            <link>https://bigdatapassion.pl/blog/od-data-lake-do-ai-czyli-jak-zdoby%C4%87-wierzcho%C5%82ek-g%C3%B3ry-lodowej-z-pomoc%C4%85-chmury-publicznej/</link>
            <pubDate>Wed, 30 Sep 2020 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/od-data-lake-do-ai-czyli-jak-zdoby%C4%87-wierzcho%C5%82ek-g%C3%B3ry-lodowej-z-pomoc%C4%85-chmury-publicznej/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/nlpday-2020.jpg&#34; alt=&#34;Featured image of post Od Data Lake do AI czyli jak zdobyć wierzchołek góry lodowej z pomocą chmury publicznej&#34; /&gt;&lt;p&gt;Poniżej nagranie mojego wystąpienia na konferencji &lt;a class=&#34;link&#34; href=&#34;https://nlpday.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AI &amp;amp; NLP Workshop Day&lt;/a&gt; która dobyła się w dniach 26 - 27 października 2020 roku w Warszawie.&lt;/p&gt;&#xA;&lt;p&gt;Skrót wystąpienia można znaleść &lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/events/nlpday-2020-invitation/&#34; &gt;tutaj&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Pierwsza część to wstęp teoretyczny, druga to praktyczne demo.&lt;/p&gt;&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/l3Mg4fYKhUk&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Serdecznie zapraszam do obejrzenia :)&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Od Data Lake do AI czyli jak zdobyć wierzchołek góry lodowej z pomocą chmury publicznej</title>
            <link>https://bigdatapassion.pl/blog/od-data-lake-do-ai-czyli-jak-zdoby%C4%87-wierzcho%C5%82ek-g%C3%B3ry-lodowej-z-pomoc%C4%85-chmury-publicznej/</link>
            <pubDate>Thu, 24 Sep 2020 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/od-data-lake-do-ai-czyli-jak-zdoby%C4%87-wierzcho%C5%82ek-g%C3%B3ry-lodowej-z-pomoc%C4%85-chmury-publicznej/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/nlpday-2020.jpg&#34; alt=&#34;Featured image of post Od Data Lake do AI czyli jak zdobyć wierzchołek góry lodowej z pomocą chmury publicznej&#34; /&gt;&lt;p&gt;W dniach 26 - 27 października 2020 roku będę miał przyjemność poprowadzić prezentację &amp;ldquo;Od Data Lake do AI czyli jak zdobyć wierzchołek góry lodowej z pomocą chmury publicznej&amp;rdquo; w ramach wydarzenia &lt;a class=&#34;link&#34; href=&#34;https://nlpday.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AI &amp;amp; NLP Workshop Day&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Data Lake i Artificial Intelligence to dzisiaj bardzo popularne slogany marketingowe powtarzane przez wiele firm zaczynających swoją przygodę z analizą danych. Tak naprawdę obydwa terminy znane są od dawna, jednak z racji coraz większej dostępności narzędzi i rosnącej mocy obliczeniowej technologie kojarzone do tej pory z firmami takimi jak Google, Amazon, Facebook i Apple (GAFA / Wielka czwórka) trafiają do wielu mniejszych organizacji. Jednak co się kryje za tymi frazesami? Ile pracy trzeba włożyć by od pierwszych bajtów danych otrzymać wartościowe rekomendacje naszych modeli predykcyjnych? Zbudować to u siebie czy skorzystać z narzędzi dostępnych na wyciągnięcie ręki w chmurze publicznej? Z jakich narzędzi skorzystać w środowisku on premise a w jakich w chmurze. Jakie są zalety jednych i drugich. Jak to połączyć z naszymi obecnymi rozwiązaniami, w tym Business Intelligence? Ile to będzie nas kosztować?&lt;/p&gt;&#xA;&lt;p&gt;Na te wszystkie pytania będę chciał odpowiedzieć w prezentacji poświęconej drodze jaką musi przejść każda firma chcąca wdrożyć rozwiązania analizy danych. Prezentacja jest adresowana zarówno do osób technicznych, w szczególności projektantów i architektów jak i osób podchodzących do tematu od strony biznesowej.&lt;/p&gt;&#xA;&lt;p&gt;Słowa kluczowe: Data Lake, Artificial Intelligence, Data Center, AWS, Azure, Google Cloud, Databricks, Snowflake, Cloudera&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>ALK - Data Science i Big Data w Zarządzaniu 2020</title>
            <link>https://bigdatapassion.pl/blog/alk-data-science-i-big-data-w-zarz%C4%85dzaniu-2020/</link>
            <pubDate>Sat, 29 Aug 2020 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/alk-data-science-i-big-data-w-zarz%C4%85dzaniu-2020/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/alk-2020.png&#34; alt=&#34;Featured image of post ALK - Data Science i Big Data w Zarządzaniu 2020&#34; /&gt;&lt;p&gt;Miło mi poinformować, że po raz kolejny mam przyjemność współtworzyć kadrę prowadzącą zajęcia na studiach Data Science i Big Data w zarządzaniu w Akademii Leona Koźmińskiego.&lt;/p&gt;&#xA;&lt;p&gt;Prowadzę przedmiot poświęcony budowaniu własnych środowisk Big Data i Data Science, zarówno on premise jak i w chmurze. Więcej szczegółów: &lt;a class=&#34;link&#34; href=&#34;https://www.kozminski.edu.pl/pl/oferta-edukacyjna/studiapodyplomowe/kierunki/big-data/program/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.kozminski.edu.pl/pl/oferta-edukacyjna/studiapodyplomowe/kierunki/big-data/program/&lt;/a&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>AI &amp; NLP WORKSHOP DAY 2020</title>
            <link>https://bigdatapassion.pl/blog/ai-nlp-workshop-day-2020/</link>
            <pubDate>Wed, 19 Aug 2020 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/ai-nlp-workshop-day-2020/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/nlpday-2020.jpg&#34; alt=&#34;Featured image of post AI &amp; NLP WORKSHOP DAY 2020&#34; /&gt;&lt;p&gt;Jest nam niezmiernie miło poinformować, że właśnie ruszyła sprzedaż biletów na tegoroczną edycję AI &amp;amp; NLP Day! Jest to już trzecia edycja konferencji poświęconej sztucznej inteligencji oraz przetwarzaniu języka naturalnego.&lt;/p&gt;&#xA;&lt;p&gt;Podczas konferencji będziesz miał możliwość porozmawiania z ekspertami, naukowcami, a także zwycięzcami konkursu PolEval.&lt;/p&gt;&#xA;&lt;p&gt;Będziesz mógł wybrać warsztaty pośród trzech ścieżek: uczenie maszynowe/sztuczna inteligencja,  Big Data,  przetwarzanie języka naturalnego oraz posłuchać prelekcji uczestników konkursu PolEval.&lt;/p&gt;&#xA;&lt;p&gt;Dzień warsztatów to czas wymiany pomysłów oraz czas rozmów biznesowych pomiędzy uczestnikami ze świata akademickiego oraz biznesu.&lt;/p&gt;&#xA;&lt;p&gt;Jakich ekspertów możesz się spodziewać w trakcie tego wydarzenia?&lt;/p&gt;&#xA;&lt;p&gt;Są to ludzie ze świata nauki i biznesu, Prelegenci i Trenerzy, Eksperci posiadający szeroką wiedzę.&lt;/p&gt;&#xA;&lt;p&gt;Specjalnie dla czytelników przygotowaliśmy zniżkę na zakup biletu -10% od ceny Early Bird!&lt;/p&gt;&#xA;&lt;p&gt;Aktualne ceny w przedsprzedaży obowiązują jedynie do 31 sierpnia, więc naprawdę warto skorzystać z promocji jak najszybciej!&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;KOD RABATOWY: 148s322k1x&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Więcej szczegółów na &lt;a class=&#34;link&#34; href=&#34;https://www.nlpday.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;stronie konferencji&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Linux Mint 20 / Ubuntu 20.04 - instalacja przydatnych narzędzi do pracy</title>
            <link>https://bigdatapassion.pl/blog/linux-mint-20-/-ubuntu-20.04-instalacja-przydatnych-narz%C4%99dzi-do-pracy/</link>
            <pubDate>Mon, 20 Jul 2020 21:28:14 +0100</pubDate>
            <guid>https://bigdatapassion.pl/blog/linux-mint-20-/-ubuntu-20.04-instalacja-przydatnych-narz%C4%99dzi-do-pracy/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/linux/Linux_Mint_Official_Logo.png&#34; alt=&#34;Featured image of post Linux Mint 20 / Ubuntu 20.04 - instalacja przydatnych narzędzi do pracy&#34; /&gt;&lt;p&gt;Do pracy, zwłaszcza tej komfortowej, potrzebujemy odpowiedniego oprogramowania które nam w tym pomaga. Od kilkunastu miesięcy moją dystrybucją numer jeden w świecie Linuxa stał się Mint, dlatego poniżej lista części moich narzędzi z których bardzo często korzystam wraz z instruckją instalacji.&lt;/p&gt;&#xA;&lt;h2 id=&#34;wersje-oprogramowania&#34;&gt;Wersje oprogramowania&#xA;&lt;/h2&gt;&lt;p&gt;Linux Mint bazuje na dystrybucji Ubuntu która to bazuje na dystrybucji Debian, dlatego podczas instalacji pakietów będziemy instalować odpowiadające wersje dla Ubuntu lub Debian.&lt;/p&gt;&#xA;&lt;p&gt;Linux Mint 20 (Ulyana) bazuje na Ubuntu 20.04 LTS (Focal Fossa) który bazuje na &lt;a class=&#34;link&#34; href=&#34;https://www.debian.org/releases/bullseye/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Debian 11 (bullseye)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Więcej o wersjach można znaleźć na stronach:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.linuxmint.com/download_all.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.linuxmint.com/download_all.php&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Linux_Mint_version_history&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://en.wikipedia.org/wiki/Linux_Mint_version_history&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://releases.ubuntu.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://releases.ubuntu.com/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://wiki.ubuntu.com/Releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://wiki.ubuntu.com/Releases&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Ubuntu_version_history&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://en.wikipedia.org/wiki/Ubuntu_version_history&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.debian.org/releases/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.debian.org/releases/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://wiki.debian.org/DebianReleases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://wiki.debian.org/DebianReleases&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Debian_version_history&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://en.wikipedia.org/wiki/Debian_version_history&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dlaczego Mint? Przede wszystkich preferuje dystrybucje oparte o Debian. Niestety repozytoria Debiana są nastawione na stabilność przez co wersje oprogramowania są starsze niż w innych dystrybucjach, zaś po kilku latach korzystania z Debiana w wersji testowej stwierdziłem że czas na stabilizację :D Początkowo postawiłem na dystrybucję Ubuntu, ale nieprzepadam za Unity czyli domyślnym managerem pulpitu w obecnych wersjach Ubuntu, stąd linux Mint wydał się najrozsądniejszą opcją :). Używam pulpitu Cinnamon oraz KDE.&lt;/p&gt;&#xA;&lt;h2 id=&#34;podstawowe-pakiety-linux&#34;&gt;Podstawowe pakiety Linux&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    alacarte &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bmon &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    byobu &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chromium-browser &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    clusterssh &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    filezilla &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gedit &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    git &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gimp &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gource &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    htop &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    iptraf &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    keepassx &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    konsole &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mc &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    meld &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    multitail &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mkvmerge &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mkvtoolnix &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mkvtoolnix-gui &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ncdu &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    obs-studio &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    openssh-server &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    openvpn &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    python3-pip &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pavucontrol &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ssh &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sshfs &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tree &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vim &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vim-addon-manager &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    virtualenv &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    webcamoid &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    wget&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;git&#34;&gt;GIT&#xA;&lt;/h2&gt;&lt;p&gt;W przypadku git&amp;rsquo;a warto od razu dodać podstawową konfigurację:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global user.name &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Imię Nazwisko&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config --global user.email &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;naszEmail@host.com&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ansible&#34;&gt;Ansible&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install software-properties-common&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt-add-repository --yes --update ppa:ansible/ansible&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install ansible&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ansible --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-ubuntu&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-ubuntu&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;docker&#34;&gt;Docker&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt remove docker docker-engine docker.io containerd runc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    apt-transport-https &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ca-certificates &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    curl &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    gnupg-agent &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    software-properties-common&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-key fingerprint 0EBFCD88&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# cat /etc/os-release&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# or&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# lsb_release -cs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo add-apt-repository &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   focal \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;   stable&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install docker-ce docker-ce-cli containerd.io&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run hello-world&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo curl -L &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://github.com/docker/compose/releases/download/1.29.2/docker-compose-&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;uname -s&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;uname -m&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; -o /usr/local/bin/docker-compose&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x /usr/local/bin/docker-compose&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/engine/install/ubuntu/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.docker.com/engine/install/ubuntu/&lt;/a&gt;&#xA;&lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/compose/install/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.docker.com/compose/install/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;virtualbox&#34;&gt;Virtualbox&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb [arch=amd64] http://download.virtualbox.org/virtualbox/debian focal contrib&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/virtualbox.list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install -y virtualbox-6.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;latex&#34;&gt;Latex&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive-binaries&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive-fonts-recommended&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive-generic-recommended&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive-latex-base&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive-latex-extra&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive-latex-recommended&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive-pictures&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y texlive-lang-polish&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;google-chrome&#34;&gt;Google Chrome&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/google-chrome.list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y google-chrome-stable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;spotify&#34;&gt;Spotify&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -sS https://download.spotify.com/debian/pubkey_0D811D58.gpg | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# echo &amp;#34;deb [arch=amd64] http://repository.spotify.com stable non-free&amp;#34; &amp;gt; /etc/apt/sources.list.d/spotify.list&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install spotify-client&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;slack&#34;&gt;Slack&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# download from https://slack.com/intl/en-pl/downloads/linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install ./slack-desktop-4.10.3-amd64.deb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;zoom&#34;&gt;Zoom&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# download from https://zoom.us/download?os=linux&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install ./zoom_amd64.deb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;signal&#34;&gt;Signal&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -O- https://updates.signal.org/desktop/apt/keys.asc | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb [arch=amd64] https://updates.signal.org/desktop/apt xenial main&amp;#34;&lt;/span&gt; |  sudo tee -a /etc/apt/sources.list.d/signal-focal.list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install signal-desktop&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dropbox&#34;&gt;Dropbox&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y dropbox&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;next-cloud&#34;&gt;Next Cloud&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install -y nextcloud-client&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;meganz&#34;&gt;Mega.nz&#xA;&lt;/h2&gt;&lt;p&gt;TODO&lt;/p&gt;&#xA;&lt;h2 id=&#34;syncthing&#34;&gt;Syncthing&#xA;&lt;/h2&gt;&lt;p&gt;From: &lt;a class=&#34;link&#34; href=&#34;https://apt.syncthing.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://apt.syncthing.net/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -s https://syncthing.net/release-key.txt | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb https://apt.syncthing.net/ syncthing stable&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/syncthing.list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt install syncthing&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dbeaver&#34;&gt;DBeaver&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -O - https://dbeaver.io/debs/dbeaver.gpg.key | sudo apt-key add -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb https://dbeaver.io/debs/dbeaver-ce /&amp;#34;&lt;/span&gt; | sudo tee /etc/apt/sources.list.d/dbeaver.list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install dbeaver-ce&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;aktualizacja-systemu&#34;&gt;Aktualizacja systemu&#xA;&lt;/h1&gt;&lt;p&gt;Poniżej polecenie aktualizacji całego systemu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt dist-upgrade &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt autoremove &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt clean &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt autoclean &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; updatedb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;przydatne-ustawienia-w-systemie&#34;&gt;Przydatne ustawienia w systemie&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/sysctl.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;vm.swappiness = 5&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/sysctl.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;reboot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /proc/sys/vm/swappiness&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Idea zarządzania zadaniami w Apache Airflow</title>
            <link>https://bigdatapassion.pl/blog/idea-zarz%C4%85dzania-zadaniami-w-apache-airflow/</link>
            <pubDate>Sun, 05 Apr 2020 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/idea-zarz%C4%85dzania-zadaniami-w-apache-airflow/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/apache-airflow-logo-big-data-passion-pl-0.png&#34; alt=&#34;Featured image of post Idea zarządzania zadaniami w Apache Airflow&#34; /&gt;&lt;p&gt;Apache Airflow to obecnie jedno z najpopularniejszych narzędzi służących do zdecentralizowania cyklicznie uruchamianych zadań w postaci workflow/pipeline. Za pomocą kodu definiujemy przepływy pracy i planujemy ich wykonanie. Dostępny lekki interfejs API jak i interfejs graficzny (WebUI) co daje możliwość wizualizacji nawet dość skomplikowanych diagramów i monitorowania ich działania co przekłada się na łatwiejsze rozwiązywanie problemów. Mamy do dyspozycji dziennik, historia zadań i szablony jinja co znacząco rozszerza możliwości kodu. Mamy jedno miejsce, gdzie przechowujemy nasz kod i jego wyniki - rejestr działania naszych zadań - znacząco to ułatwia, gdyż samo opisanie tych przepływów jako kod daje większą swobodę w utrzymywaniu, wersjonowaniu i współdzieleniu naszych zadań.&lt;/p&gt;&#xA;&lt;p&gt;W środowiskach produkcyjnych potrafi uruchomić 3500 sparkowych jobów dziennie na 50 klastrach Apache Hadoop &lt;a class=&#34;link&#34; href=&#34;https://medium.com/appsflyer/how-appsflyer-uses-apache-airflow-to-run-over-3-5k-daily-jobs-and-more-683106cb24fc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;źródło&lt;/a&gt; - duża skala, robi wrażenie.&lt;/p&gt;&#xA;&lt;p&gt;Apache Airflow udowodnił, że można budować przepływy pracy bez skomplikowanych plików konfiguracyjnych lub szczegółowych definicji DAG.&lt;/p&gt;&#xA;&lt;h2 id=&#34;jak-powstał-airflow&#34;&gt;Jak powstał Airflow?&#xA;&lt;/h2&gt;&lt;p&gt;Projekt Airflow wystartował w październiku 2014 roku dzięki Maxime Beauchemin w Airbnb. Od początku było to oprogramowanie typu open source i od czerwca 2015 roku oficjalnie hostowane na GitHub na profilu Airbnb. Projekt dołączył do programu Inkubatora &lt;a class=&#34;link&#34; href=&#34;https://www.apache.org/foundation/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Apache Software Foundation&lt;/a&gt;. W marcu 2016 r. Fundacja ogłosiła Apache Airflow jako projekt &amp;ldquo;najwyższego poziomu&amp;rdquo; (ang. first level) w styczniu 2019 r.&lt;/p&gt;&#xA;&lt;p&gt;Warto wspomnieć o sponsorach tego projektu, m. in.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Comcast&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pineapple Fund&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Microsoft&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;LeaseWeb&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Tencent&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Amazon Web Services&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Facebook&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Cloudera&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Pozostali to: ARM, Bloomberg, Handshake, Huawei, IBM, Indeed, Union Investment, Workday jak i anonimowi darczyńcy.&lt;/p&gt;&#xA;&lt;h2 id=&#34;zalety&#34;&gt;Zalety&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;AirFlow Features BigDataPassion&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/airflow-features-bigdatapassion-0.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;główny-język-to-python&#34;&gt;Główny język to Python&#xA;&lt;/h4&gt;&lt;p&gt;Python jest użyty do tworzenia kodu przepływu pracy w tym formatów daty i godziny do planowania zadań i pętli do dynamicznego generowania zadań.&lt;/p&gt;&#xA;&lt;h4 id=&#34;interfejs-graficzny&#34;&gt;Interfejs graficzny&#xA;&lt;/h4&gt;&lt;p&gt;Monitoruje, planuje i zarządza przepływami pracy za pomocą interfejsu webowego, gdzie mamy dostęp do w statusu ukończonych i bieżących zadań wraz z wglądem w ich logi.&lt;/p&gt;&#xA;&lt;h4 id=&#34;duża-liczba-zintegrowanych-usług&#34;&gt;Duża liczba zintegrowanych usług&#xA;&lt;/h4&gt;&lt;p&gt;Dzięki plug-and-play mamy ułatwione zadanie, aby móc się połączyć z pewnymi usługami udostępnionymi przez np. dostawców chmurowych AWS, GCP czy Azure.&lt;/p&gt;&#xA;&lt;h4 id=&#34;łatwość&#34;&gt;Łatwość&#xA;&lt;/h4&gt;&lt;p&gt;Wystarcza wiedza o języku Python, aby móc już transferować dane, zarządzać infrastrukturą czy nawet budować modele machine learning.&lt;/p&gt;&#xA;&lt;h4 id=&#34;projekt-open-source&#34;&gt;Projekt Open Source&#xA;&lt;/h4&gt;&lt;p&gt;Airflow ma wielu aktywnych użytkowników, którzy chętnie dzielą się swoimi doświadczeniami. Zalet OS jest wiele, więc chętnie z tego korzystamy :).&lt;/p&gt;&#xA;&lt;h2 id=&#34;architektura&#34;&gt;Architektura&#xA;&lt;/h2&gt;&lt;p&gt;Ogólna architektura przedstawianego rozwiązania składa się z poniższych elementów:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;web server&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;master repo&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;scheduler&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;code repo&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;metadata database&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;workers&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;      [ PostgreSQL ]  [ MariaDB ] &#xA;      ____/_____________/_ _ _ _ _&#xA;     |&#xA;     |    A I R F L O W&#xA;     |          &#xA;  [ webserver ]  [ executor ]&#xA;&#xA;    [ repo ]     scheduler + worker&#xA;&#xA; code + master  &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;wybrane-elementy-systemu-i-pojęcia&#34;&gt;Wybrane elementy systemu i pojęcia&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;DAG&lt;/strong&gt; Directed Acyclic Graph&lt;/p&gt;&#xA;&lt;p&gt;Najłatwiej tłumaczyć to sobie jako zadania a grupa takich zadań wykonuje już jakąś pracę. Przykładem może być zadanie Sparkowe, ETL, ML, CI, etc.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Jinja&lt;/strong&gt; szablony&lt;/p&gt;&#xA;&lt;p&gt;Wbudowane szablony pozwalają na używanie wielu zmiennych czy makr (np. szczegóły zadania, znacznik czasu wykonania) podczas wykonywania zadania. Ogólnie pobierają informację o środowisku.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt; zaimplementowane w Pythonie&lt;/p&gt;&#xA;&lt;p&gt;Interfejs API może zostać wykorzystany do m. in. bardziej jawnej kontroli procesów.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Czas&lt;/strong&gt; i &lt;strong&gt;Planowanie&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;W Airflow nie ma możliwości uruchomienia jakiegokolwiek zadania DAG bez wskazania daty wykonania. Podobnie DAG nie może być uruchomiony kilkukrotnie w tym samym czasie tj. dla tej samej daty wykonania. Jeśli istnieje konieczność uruchomienia wielu instancji zadania to (bez kreatywności - potrzeba matką wynalazków;)) nie ma takiej możliwości. Ciekawsze jest to, że data wykonania &lt;code&gt;execution_date&lt;/code&gt; to nie jest to samo co data rozpoczęcia zadania - należy o tym pamiętać. Data wykonania to miejsce w czasie od którego może zostać uruchomione zadanie DAG.&lt;/p&gt;&#xA;&lt;p&gt;Na poniższym wykresie &lt;code&gt;gwiazdki&lt;/code&gt; oznaczają planowany czas wykonania zadania (interwał to codziennie o 5:05), &lt;code&gt;kratka&lt;/code&gt; wskazuje zdefiniowaną datę wykonania, &lt;code&gt;dolar&lt;/code&gt; oznacza kiedy uruchomiliśmy DAG a &lt;code&gt;duży iks&lt;/code&gt; kiedy zadanie się jeszcze nie mogło wykonać. (Tak, lubię ASCII art).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;     data                  (harmonogram)&#xA; uruchomienia           [schedule_interval]&#xA; zadania  DAG                &amp;#39;5 5 * * &amp;#39;&#xA;      |                           |&#xA;_ _ _ | _ ________________________|_____________ _ _ &#xA;    | |   |     |     |     |     |     |     |&#xA; - -X-$---X---#-*-----*-----*-----*-----*-----*- - - &amp;gt;&#xA;              |                                 (oś czasu)&#xA;         &amp;#39;{{ ds }}&amp;#39;&#xA;      [execution_date]&#xA;      (data wykonania)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;W przypadku, gdy nie chcemy planowania wyłączamy możliwość za pomocą &lt;code&gt;schedule_interval=None&lt;/code&gt;. Jeśli mamy cykliczność naszego zadania DAG to możemy użyć adnotacji podobnie jak w linuksowym cronie - przykład dla oby dwóch form w tabelce.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;opisowo&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;jak w CRONie&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;interwal&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;None&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;brak zapisu&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Brak powtarzalności&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;@once&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;brak zapisu&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Uruchamiamy tylko raz&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;@hourly&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0 * * * *&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Godzina&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;@daily&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0 0 * * *&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dzień&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;@weekly&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0 0 * *&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Tydzień&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;@monthly&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0 0 1 * *&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Miesiąc&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;@yearly&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;0 0 1 1 *&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Rok&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Do dyspozycji posiadamy jeszcze określenie punktu początkowego &lt;code&gt;start_date&lt;/code&gt; i końcowego &lt;code&gt;end_date&lt;/code&gt; na osi czasu. Data początkowa niekoniecznie musi być wykonana, gdy pierwszy przebieg DAG zostanie wykonany, ponieważ&lt;/p&gt;&#xA;&lt;p&gt;Domyślne &lt;strong&gt;zmienne&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Zmienne określające czas w większości się duplikują a wszystko za sprawą postfiksa &lt;code&gt;_nodash&lt;/code&gt;, który wprowadza inny zapis. Dla przykładu zapis &lt;code&gt;{{ ds }}&lt;/code&gt; i &lt;code&gt;{{ ds_nodash }}&lt;/code&gt; wskazuje na tą samą zmienną i wartość z tą różnicą, że wartość ma dwa różne zapisy. Przykłady w tabelce.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;ds&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;YYYY-MM-DD&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Przykład&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;2020-03-03&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;ds_nodash&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;YYYYMMDD&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Przykład&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;20200303&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Pod tabelką opisałem ważniejsze cechy.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Zmienne&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Opis&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;{{ ds }} {{ ds_nodash }}&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Data wykonania&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;{{ prev_ds }} {{ prev_ds_nodash }}&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Jeśli istnieje - wcześniejsza data wykonania&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;{{ next_ds }} {{ next_ds_nodash }}&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Jeśli istnieje to kolejny zapis czasu kiedy jest planowane uruchomienie&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;{{ yesterday_ds }} {{ yesterday_ds_nodash }}&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dzień wcześniej&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;{{ tomorrow_ds }} {{ tomorrow_ds_nodash }}&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Kolejny dzień&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;{{ ts }} {{ ts_nodash }}&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dokładniejszy czas w formacie ISO&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Dla &lt;code&gt;prev_ds&lt;/code&gt; / &lt;code&gt;prev_ds_nodash&lt;/code&gt; wcześniejszą datę możemy otrzymać, jeśli był wprowadzony interwal w &lt;code&gt;schedule_interval&lt;/code&gt; np. &lt;code&gt;@daily&lt;/code&gt; - tu zapis jaki powinien się pojawić to &lt;code&gt;2020-03-02&lt;/code&gt; / &lt;code&gt;20200302&lt;/code&gt;. Tak samo to wygląda dla przyszłych dat a więc dla &lt;code&gt;next_ds&lt;/code&gt; / &lt;code&gt;next_ds_nodash&lt;/code&gt;. Należy zauważyć: jeżeli Airflow nie jest w stanie wyświetlić właściwych wartości to przekaże &lt;code&gt;None&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Format ISO:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;dla &lt;code&gt;ts&lt;/code&gt;: 2020-03-03T00:00:00+01:00 - wzorowy zapis,&lt;/li&gt;&#xA;&lt;li&gt;dla &lt;code&gt;ts_nodash&lt;/code&gt;: 20200303T0000000100 - usunięte wszystkie znaki, które nie są alfanumeryczne i brak informacji o strefie czasowej,&lt;/li&gt;&#xA;&lt;li&gt;dla &lt;code&gt;ts_nodash_with_tz&lt;/code&gt;: 20200303T0000000100 - usunięte wszystkie znaki, które nie są alfanumeryczne.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Operatory&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Każde zadanie jest zbudowane za pomocą operatorów - można wykorzystać już istniejące (domyślne wbudowane, zobacz &lt;a class=&#34;link&#34; href=&#34;https://github.com/apache/airflow/tree/master/airflow/operators&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/apache/airflow/tree/master/airflow/operators&lt;/a&gt;) lub napisać własne. Operatory określają co zostanie wykonane przy uruchomieniu zadania. Podzielić je można na kilka grup:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;BashOperator&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dingding Operators&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Google Cloud Operators&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Papermill&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;PythonOperator&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Cross-DAG Dependencies&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Przykładem może być: &lt;a class=&#34;link&#34; href=&#34;https://airflow.apache.org/docs/stable/_modules/airflow/example_dags/example_bash_operator.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://airflow.apache.org/docs/stable/_modules/airflow/example_dags/example_bash_operator.html&lt;/a&gt;. Operator można połączyć z szablonami co znacząco rozszerza jego produktywność. Nie bez znaczenia jest spacja na końcu polecenia, bez niej Python nie może odczytać szablonu.&lt;/p&gt;&#xA;&lt;p&gt;Błędna składnia&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;passion0x00 = BashOperator(&#xA;  task_id=`bigdata`,&#xA;  bash_command=&amp;#34;bigdatapassion.sh&amp;#34;,&#xA;  dag=dag)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Właściwa składnia (z odstępem na końcu polecenia)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;passion0x00 = BashOperator(&#xA;  task_id=`bigdata`,&#xA;  bash_command=&amp;#34;bigdatapassion.sh &amp;#34;,&#xA;  dag=dag)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;bardzo-szybki-start&#34;&gt;Bardzo szybki start&#xA;&lt;/h2&gt;&lt;p&gt;Nie musimy instalować, możemy skorzystać z już istniejących rozwiązań SaaS dostępnych w chmurze - np. Google Cloud Platform (GCP) (&lt;a class=&#34;link&#34; href=&#34;https://cloud.google.com/composer/docs/how-to/accessing/airflow-web-interface&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cloud.google.com/composer/docs/how-to/accessing/airflow-web-interface&lt;/a&gt;) lub lokalnie uruchomić obraz Docker&amp;rsquo;a - &lt;a class=&#34;link&#34; href=&#34;https://github.com/puckel/docker-airflow&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/puckel/docker-airflow&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;instalacja&#34;&gt;Instalacja&#xA;&lt;/h2&gt;&lt;p&gt;Zalecanym sposobem wdrożenia środowiska Airflow jest instalacja za pomocą menedżera pakietów &lt;code&gt;pip&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install apache-airflow&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Powyższe polecenie zainstaluje minimalny zestaw pakietów potrzebny do uruchomienia środowiska. Fakultatywnie dla naszego środowiska można domieszać takie składniki jak integracja z bazami danych (np. PostgreSQL, MariaDB, Microsoft SQL Server), integracje z platformami autoryzacji (np. LDAP, Google Auth, GitHub Auth), czy z środowiskami chmurowymi (np. Amazon Web Services, Microsoft Azure, Google Cloud Platform). Przykład dla zdalnego wykonywania zadań za pomocą połączenia SSH:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install &amp;#39;apache-airflow[ssh]&amp;#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Do dyspozycji mam ponad 30 dodatkowych pakietów umożliwiające nam rozwinięcie funkcjonalności naszej instancji Airflow. Należy zwrócić uwagę, że dla środowisk produkcyjnych należy posłużyć się zewnętrzną bazą danych (np. PostgreSQL lub MariaDB/MySQL) a dla testowych pozostać można przy domyślnej SQLite.&lt;/p&gt;&#xA;&lt;p&gt;Po instalacji wymagana jest inicjalizacja bazy danych - nie ma znaczenia czy to dla SQLite czy innych zewnętrznych.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;airflow initdb&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Połączenie z bazami danych realizowane jest za pomocą biblioteki SqlAlchemy (udostępnia funkcjonalność SQL bez potrzeby pisania bezpośrednio zapytań do bazy za pomocą tradycyjnego SQLa, wspiera ponad 25 typów połączeń do baz danych), dzięki czemu Airflow jest w stanie korzystać z dowolnej bazy obsługującej backend SqlAlchemy.&lt;/p&gt;&#xA;&lt;h2 id=&#34;jak-ubogacić-nasze-środowisko&#34;&gt;Jak ubogacić nasze środowisko?&#xA;&lt;/h2&gt;&lt;p&gt;Z czasem nasze środowisko może się skomplikować, możemy je próbować posprzątać za pomocą:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;clear-missing-dags&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Okresowo czyści wpisy w tabeli DAG, dla których nie ma już odpowiedniego pliku Python&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;db-cleanup&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dbanie o porządek w MetaStore czyszcząc DagRun, TaskInstance, Log, XCom, Job DB, wpisy SlaMiss&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;kill-halted-tasks&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Cyklicznie wyszukuje zadania, które są uruchomione a nie ma ich w bazie danych&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;log-cleanup&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Czyścimy dziennik zadań, aby nie utrzymywać jego zbyt dużego rozmiaru&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;delete-broken-dags&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Czyszczenie tabeli ImportErrora, uruchamiamy aby okresowo usuwać pliki DAG i czyścić wpisy w tabeli ImportError dla DAG, których Airflow nie może poprawnie przeanalizować ani zaimportować&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;jak-nie-airflow-to-co&#34;&gt;Jak nie Airflow to co?&#xA;&lt;/h2&gt;&lt;p&gt;W świecie Big Data jest mnogość alternatyw - zestawienie (poglądowe posortowane alfabetycznie) w tabelce.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Nazwa&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Adres / Opis&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Adage&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/yadage/adage&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/yadage/adage&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Argo&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://argoproj.github.io/argo/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://argoproj.github.io/argo/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Aurora&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://aurora.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://aurora.apache.org/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Azkaban&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://azkaban.github.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://azkaban.github.io/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Azure Data Factory&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.microsoft.com/en-us/azure/data-factory&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.microsoft.com/en-us/azure/data-factory&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Chronos&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://mesos.github.io/chronos/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://mesos.github.io/chronos/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Falcon&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://falcon.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://falcon.apache.org/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Kedro&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/quantumblacklabs/kedro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/quantumblacklabs/kedro&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Luigi&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/spotify/luigi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/spotify/luigi&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;NiFi&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://nifi.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://nifi.apache.org/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Oozie&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://oozie.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://oozie.apache.org/&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Pinball&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pinterest/pinball&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/pinterest/pinball&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Schedoscope&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/ottogroup/schedoscope&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/ottogroup/schedoscope&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Sparrow Scheduler&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/radlab/sparrow&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/radlab/sparrow&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;</description>
        </item><item>
            <title>AWS re:Invent re:Cap 2019 - AWS User Group PL Meetup - Warsaw</title>
            <link>https://bigdatapassion.pl/blog/aws-reinvent-recap-2019-aws-user-group-pl-meetup-warsaw/</link>
            <pubDate>Tue, 21 Jan 2020 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/aws-reinvent-recap-2019-aws-user-group-pl-meetup-warsaw/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/reinvent-recap-2019.jpeg&#34; alt=&#34;Featured image of post AWS re:Invent re:Cap 2019 - AWS User Group PL Meetup - Warsaw&#34; /&gt;&lt;p&gt;Jak co roku, AWSowy re:Invent dostarczył wielu emocji użytkownikom i sympatykom tej chmury. Jest to największa konferencja organizowana co roku przez AWS  gdzie ogłaszane są wszystkie nowości wprowadzane do platformy których co roku jest coraz więcej (aktualnie wypada średnio już ponad 5 dziennie).&lt;/p&gt;&#xA;&lt;p&gt;Niestety nie każdy może sobie pozwolić na kilkudniowy pobyt na konferencji z dala od domu, dlatego powstała inicjatywa dzielenia się nowościami w platformie z community w wielu krajach na świecie w ramach tak zwanego &amp;ldquo;AWS re:Invent re:Cap&amp;rdquo;. Udział w wydarzeniu wzięło &lt;a class=&#34;link&#34; href=&#34;https://aws-reinvent-recap-community-world-tour.splashthat.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;21 europejskich miast&lt;/a&gt;, a wśród nich Warszawa.&lt;/p&gt;&#xA;&lt;p&gt;W Warszawie prezentację poprowadził &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/developer/community/evangelists/alex-casalboni/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Alex Casalboni&lt;/a&gt;, ja zaś miałem niezwykłą przyjemność wspomóc go i poprowadzić część związaną z nowościami w obszarze Machine Learning, w szczególności w usłudze SageMaker :)&lt;/p&gt;&#xA;&lt;p&gt;Więcej informacji o wydarzeniu jak i zdjęcia można znaleźć na portalu &lt;a class=&#34;link&#34; href=&#34;https://www.meetup.com/AWSUGPL/events/267755216/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;meetup&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Erasure Coding a Replikacja</title>
            <link>https://bigdatapassion.pl/blog/erasure-coding-a-replikacja/</link>
            <pubDate>Tue, 24 Dec 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/erasure-coding-a-replikacja/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/hdfs-erasure-coding-versus-replication-logo.png&#34; alt=&#34;Featured image of post Erasure Coding a Replikacja&#34; /&gt;&lt;h2 id=&#34;cechy-hdfs-erasure-coding&#34;&gt;Cechy HDFS Erasure Coding&#xA;&lt;/h2&gt;&lt;p&gt;Największą zaletą EC (Erasure Coding) w porównianiu do replikacji to redukcja zajętości miejsca. Przy domyślnej replikacji (3) te same dane w EC zajmują połowę powierzchni dyskowych. Dane są przechowywane w różnych lokalizacjach, gdzie nadal mamy pewność, że w przypadku utraty dysku jesteśmy w stanie odbudować brakujące informacje. Zauważmy, że poziom bezpieczeństwa jest taki sam jak w przypadku replikacji tj. mamy 3 kopie. Wygląda to super i tak w rzeczywistości jest, ale.&lt;/p&gt;&#xA;&lt;p&gt;Jeden z poważniejszych minusów takiego przechowywania to brak lokalności rekordów (danych). Istotna funkcjonalność HDFS to &lt;code&gt;block locality&lt;/code&gt;, którą tracimy wraz z uruchomieniem EC, dlatego że pocięte bloki danych są rozrzucane po DataNodach tzn. lokalnie nie mamy pełnej informacji nad którą możemy pracować. Sama obsługa danych w Erasure Coding to proces wymagający większego zaangażowania zasobów.&lt;/p&gt;&#xA;&lt;p&gt;Erasure Coding to świetny sposób na archiwizacje zimnych danych lub też tworzenie punktów Disaster Recovery.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  D A N E&#xA;  ^&#xA;  └─ D&amp;#39;───D&amp;#39;&#xA;    / \  / \&#xA;   /   \/   \&#xA;  d&amp;#39;   d&amp;#39;&amp;#39;  d&amp;#39;&amp;#39;&amp;#39;&#xA;  ^^^^^^^^^^^^^^&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;cechy-replikacji-w-hdfs&#34;&gt;Cechy replikacji w HDFS&#xA;&lt;/h2&gt;&lt;p&gt;Podstawową strategią utrzymywania danych w wysokiej dostępności w HDFS jest replikacja. Tworzenie kopii bloków pomaga w ciągłej pracy klastra w przypadku awarii dysku/dysków, węzła/węzłów (np. DN) czy nawet całego zespołu serwerów dla konfiguracji (z wdrożonym podziałem na kilka Rack). Teoretycznie (przy replikacji równej &lt;code&gt;n&lt;/code&gt;) w idealnych warunkach (każdy blok danych n-repliki znajduje się w tej samej grupie DataNodów - z podziałem na równe grupy) utrata &lt;code&gt;n-1/n&lt;/code&gt; maszyn w klastrze nie powinna przerwać jego działania.&lt;/p&gt;&#xA;&lt;p&gt;Przechowywanie wielu kopii daje również duży zysk w przypadku zrównoleglenia odczytu (np. hot) danych przez klientów, gdyż każdy klient czyta z wybranych DN (DataNodów).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdfs-erasure-coding-versus-replication-replication-schema-0.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;replikacja-a-lokalizacja-zasobów&#34;&gt;Replikacja a lokalizacja zasobów&#xA;&lt;/h3&gt;&lt;p&gt;Są dwa podejścia do wykonania replikacji.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;W obrębie klastra wykorzystując wbudowane narzędzia lub własne do kopiowania danych pomiędzy instancjami w klastrze i po za nim (np. do AWS S3)&lt;/li&gt;&#xA;&lt;li&gt;Tworzyć i zarządzać strumieniami dbając o ciągłe przesyłanie informacji do wybranych klastrów lub elementów po za HDFSem (np. ELK Stack)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dla replikacji w aplikacjach jest kilka narzędzi, które mają wbudowane opisane mechanizmy.&lt;/p&gt;&#xA;&lt;h4 id=&#34;apache-hbase&#34;&gt;Apache HBase&#xA;&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://hbase.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://hbase.apache.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Przykładem jest baza danych &lt;code&gt;Apache HBase&lt;/code&gt;, gdzie algorytm pomaga przenosić wszystkie modyfikacje w cf (column family) na inny klaster. Istnieje również kompleksowe rozwiązanie typu master-master czy master-follower, gdzie każdy zapis jest w czasie rzeczywistym wysyłany na klaster. Idealnym (optymalnym) środowiskiem jest tu połączenie sieciowe o wysokiej przepustowości i niskiej latency (punkty są &amp;lsquo;blisko siebie&amp;rsquo;). Należy pamiętać, że to nie zastępuje backupu.&lt;/p&gt;&#xA;&lt;h4 id=&#34;apache-kafka&#34;&gt;Apache Kafka&#xA;&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://kafka.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://kafka.apache.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Innym przykładem jest &lt;code&gt;Apache Kafka&lt;/code&gt;, która potrafi przenosić dane do jednego lub wielu klastwów Hadoop.&lt;/p&gt;&#xA;&lt;h4 id=&#34;apache-flume&#34;&gt;Apache Flume&#xA;&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://flume.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://flume.apache.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Świetnym narzędziem jest opisywany na blogu &lt;code&gt;Apache Flume&lt;/code&gt; &lt;a class=&#34;link&#34; href=&#34;http://bigdatapassion.pl/categories/apache-flume/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://bigdatapassion.pl/categories/apache-flume/&lt;/a&gt;. Narzędzie strumieniuje dane z wielu źródeł do wielu lokalizacji.&lt;/p&gt;&#xA;&lt;h4 id=&#34;apache-nifi&#34;&gt;Apache Nifi&#xA;&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://nifi.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://nifi.apache.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Coraz częściej spotkamy &lt;code&gt;Apache Nifi&lt;/code&gt; jako zamiennik / następca, który obsługuje dużą liczbę komponentów. Nifi zarządza przepływem informacji pomiędzy różnymi systemami, łączy je i zarządza ich dalszym losem.&lt;/p&gt;&#xA;&lt;h4 id=&#34;apache-oozie&#34;&gt;Apache Oozie&#xA;&lt;/h4&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://oozie.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://oozie.apache.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tu &lt;code&gt;Apache Oozie&lt;/code&gt; dobrze współpracuje pomiędzy zasobami przechowywania danych (storage) a bazami danych w różnych kombinacjach. Przykładem jest zrównoleglony odczyt danych z HBase i zapis na HDFS.&lt;/p&gt;&#xA;&lt;h3 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h3&gt;&lt;p&gt;Do całości można dodać funkcjonalność tworzenia migawek &lt;code&gt;snapshot&lt;/code&gt;, która jest demonem prędkości podczas przywracania danych po awarii. Pamiętajmy, że to nadal nie jest pełnoprawna kopia zapasowa, gdyż nie zastąpuje to Disaster Recovery (DR).&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Big Data Technology Warsaw Summit 2020</title>
            <link>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2020/</link>
            <pubDate>Mon, 16 Dec 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-technology-warsaw-summit-2020/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/big-data-technology-summit-warsaw-2020.jpg&#34; alt=&#34;Featured image of post Big Data Technology Warsaw Summit 2020&#34; /&gt;&lt;p&gt;Jesteś pasjonatem Big Data, Data Science, inżynierii i monetyzacji danych, przetwarzania danych w czasie rzeczywistym?&lt;/p&gt;&#xA;&lt;p&gt;27 lutego 2020, w Warszawie, jedyna taka okazja w roku - duża międzynarodowa konferencja - &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/?utm_source=patron&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B02_12.2019&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Big Data Technology Warsaw Summit 2020&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;W 6. edycji weźmie udział ponad 500 uczestników - nie możesz tego przegapić!&lt;/p&gt;&#xA;&lt;p&gt;Duża część &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/speakers/?utm_source=patron&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B02_12.2019&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;prelegentów&lt;/a&gt; przybędzie z zagranicy, zaś wszyscy to wybitni fachowcy – inżynierowie, architekci, deweloperzy. Podzielą się doświadczeniem zdobytym przy wyjątkowo ciekawych projektach – w takich firmach jak Alibaba, Amazon Web Services, Booking.com, Orange, Philip Morris International, Zalando i in.&lt;/p&gt;&#xA;&lt;p&gt;Konferencja jest praktyczna i technologiczna – towarzyszą jej &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/workshops/?utm_source=patron&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B02_12.2019&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;dwa dni warsztatów do wyboru&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Developing production-ready Spark application&lt;/li&gt;&#xA;&lt;li&gt;Real-Time stream processing&lt;/li&gt;&#xA;&lt;li&gt;Big Data on Kubernetes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;A dla zapracowanych i zabieganych &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/tutorials/?utm_source=patron&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B02_12.2019&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;4-godzinne tutoriale&lt;/a&gt; - pigułka mocno skoncentrowanej wiedzy:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Detect, capture, and ingest changed data from RDBMS to Hadoop&lt;/li&gt;&#xA;&lt;li&gt;From event to insights&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dołącz do uczestników konferencji i skorzystaj z promocji przy rejestracji do 19 grudnia!&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Z kodem „BIgDataPassion” otrzymasz 10% rabatu na udział w konferencji!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wszystkie informacje znajdziesz &lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/registration/?utm_source=patron&amp;amp;utm_medium=patron&amp;amp;utm_campaign=2B02_12.2019&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tutaj&amp;raquo;&amp;gt;&lt;/a&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Analiza danych w czasie rzeczywistym za pomocą Apache Kafka</title>
            <link>https://bigdatapassion.pl/blog/analiza-danych-w-czasie-rzeczywistym-za-pomoc%C4%85-apache-kafka/</link>
            <pubDate>Sat, 14 Dec 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/analiza-danych-w-czasie-rzeczywistym-za-pomoc%C4%85-apache-kafka/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/confitura-2019.jpg&#34; alt=&#34;Featured image of post Analiza danych w czasie rzeczywistym za pomocą Apache Kafka&#34; /&gt;&lt;p&gt;Na kanale &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/channel/UCkVjQGf_e0JmlonPMS4VNXQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;YouTube&lt;/a&gt; Confitury pojawiły się nagrania z tegorocznej konferencji.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej relacja:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/gqhC2lvsecs&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;oraz moja prezentacja:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/4WjQ4l2pqsE&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>II edycja What the H@ck (WTH)</title>
            <link>https://bigdatapassion.pl/blog/ii-edycja-what-the-h@ck-wth/</link>
            <pubDate>Fri, 13 Dec 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/ii-edycja-what-the-h@ck-wth/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/what-the-hack-2019.png&#34; alt=&#34;Featured image of post II edycja What the H@ck (WTH)&#34; /&gt;&lt;p&gt;Całe środowisko polskiego IT Security – musisz tu być!&lt;/p&gt;&#xA;&lt;p&gt;W sobotę, 14 grudnia w Warszawie odbędzie się II edycja &lt;code&gt;What the H@ck (WTH)&lt;/code&gt; – najważniejszej konferencji z obszaru polskiego IT Security adresowanej do osób zainteresowanych szeroko pojętym bezpieczeństwem IT.&lt;/p&gt;&#xA;&lt;p&gt;Projekt wyróżnia przede wszystkim ciekawa, konkretna i bogata agenda. Będzie można znaleźć w niej aż 14 równoległych ścieżek, z takich obszarów jak i.in. red teaming (atak), blue teaming (obrona), zagadnienia architektoniczne, bezpieczeństwo instytucji finansowych, bezpieczeństwo rozwiązań typu &lt;code&gt;cloud&lt;/code&gt; i &lt;code&gt;mobile&lt;/code&gt;, trendy, ryzyko IT, czy zagadnienia prawne pod kątem bezpieczeństwa informatycznego. Łącznie będzie czekało na uczestników blisko sto konkretnych wystąpień, w których położyliśmy nacisk na wysokiej jakości wartość merytoryczną. Wystąpienia przygotowane są m.in. przez doświadczonych praktyków, ekspertów i konsultantów oraz przedstawicieli środowisk naukowych.&lt;/p&gt;&#xA;&lt;p&gt;Na koniec dnia, zapewne spore grono uczestników, spotka się dodatkowo na oficjalnym &lt;code&gt;afterparty&lt;/code&gt;. Będzie to okazji do poznania prelegentów i innych osób z branży – zwłaszcza, że całość odbywać się będzie w sobotę.&lt;/p&gt;&#xA;&lt;p&gt;W takcie wydarzenia, uczestnicy będą mieli również możliwość odwiedzenia stoisk Sponsorów i Partnerów. Warto zobaczyć jakie produkty, usługi lub oferty rekrutacyjne oferują czołowe organizacji z obszaru IT Security.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/banner/news/wth-what-the-hack_v2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sponsorami wydarzenia są: Standard Chartered, Accenture, Microsoft, ING Tech, T-Systems, Samsung.&lt;/p&gt;&#xA;&lt;p&gt;Organizatorami wydarzenia są: Zaufana Trzecia Strona, Fundacja Academic Partners.&lt;/p&gt;&#xA;&lt;p&gt;Więcej informacji: &lt;a class=&#34;link&#34; href=&#34;https://www.WTHconf.pl&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.WTHconf.pl&lt;/a&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Apache Flume jako agregator strumieni danych</title>
            <link>https://bigdatapassion.pl/blog/apache-flume-jako-agregator-strumieni-danych/</link>
            <pubDate>Tue, 19 Nov 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/apache-flume-jako-agregator-strumieni-danych/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/flume-logo-1.png&#34; alt=&#34;Featured image of post Apache Flume jako agregator strumieni danych&#34; /&gt;&lt;p&gt;W środowiskach Big Data proces przejmowania jest często elementem całości przepływu ETL. Owe przejmowanie danych rozumiemy jako pobieranie treści z takich źródeł jak bazy danych czy pliki. Bardziej złożonymi formami (w większości przypadków) to źródła rzadziej używane na co dzień a więc NoSQL, maile, API, IoT, których skala, różnorodność i złożoność można opisać w dwóch słowach: Volume i Variety. Przy tak dużym surowcu danych naturalną decyzją jest przejście z modelu przetwarzania wsadowego na tryb czasu rzeczywistego (np. przy użyciu narzędzia Kafka). Dochodzimy do kolejnego &lt;code&gt;V&lt;/code&gt; jakim jest Velocity: czas, prędkość i zmienność. Czwartym elementem opisywanych danych jest Veracity: jakość, pewność i pochodzenie. I tu wkradają się kolejne wyzwania, gdzie należy stawić czoła: niedokładności danych, niekompletności, niespójności, wątpliwej (nieopisanej) wiarygodności czy nieprawdziwości. Wynik eksploracji danych jest mocno zależny od ich jakości.&lt;/p&gt;&#xA;&lt;h2 id=&#34;apache-flume-i-podobne-rozwiązania&#34;&gt;Apache Flume i podobne rozwiązania&#xA;&lt;/h2&gt;&lt;p&gt;Flume to projekt &lt;code&gt;Apache Software Foundation&lt;/code&gt;, jest opisany jako usługa agregowania danych, która jest: rozproszona, niezawodna i dostępna. Flume jest bardzo elastyczny (umożliwia wiele idei wdrażania) i umożliwia przesyłanie dużych ilości danych (ruch sieciowy, dane społecznościowe, logi) co daje dużo możliwości dostosowania do środowiska. Należy uwypuklić dużą konfigurowalność narzędzia, aplikacja nie ogranicza się tylko do agregacji danych. Przykład, jeśli musimy wdrożyć dane dziennika (tekstowe) do Hadoopa/HDFS to Flume jest odpowiednim narzędziem.&lt;/p&gt;&#xA;&lt;p&gt;Ograniczeniem wielkości tego bytu jest (technicznie) możliwość zapisu go w przestrzeni dyskowej czy pamięci. Należy zwrócić uwagę, że aplikacja stworzona jest do ciągłego przetwarzania danych, lecz brak tej stabilności strumienia danych nie powoduje problemów w jej funkcjonowaniu.&lt;/p&gt;&#xA;&lt;p&gt;Warto zarekomendować, że ze względu na swą łatwość konfiguracji Flume jest uwielbianym konstruktorem logów a uznawanie go za &amp;lsquo;realtime data processors&amp;rsquo; jest jednym z jego funkcjonalności. Popularność zawdzięcza faktowi, że było to jedne z pierwszych narzędzi do gromadzenia danych w Hadoopie. Flume też ma swoją smutniejszą stronę, jest wypierany przez inne narzędzia (np. takie jak NiFi) i zasadność wdrożenia tej technologi należy poprzedzić analizą a więc zainwestować czas na prześledzenie innych dostępnych rozwiązań.&lt;/p&gt;&#xA;&lt;p&gt;Podobne technologie to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Sqoop (hadoop &amp;lt;-&amp;gt; RDBMS)&lt;/li&gt;&#xA;&lt;li&gt;Oozie (natywne hadoopowe narzędzie do uporządkowania ETL)&lt;/li&gt;&#xA;&lt;li&gt;NiFi (zarządza i kontroluje przepływy z obsługą myszki - GUI)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/flume-schema-2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;technicznie-o-flume&#34;&gt;Technicznie o Flume&#xA;&lt;/h2&gt;&lt;p&gt;Flume jest zaprojektowany do transportu i przetwarzania regularnie generowanych danych zdarzeń w relatywnie stabilnych, potencjalnie złożonych topologiach. Jak już jesteśmy przy &lt;code&gt;zdarzeniach&lt;/code&gt; to je zdefiniujmy jako ciąg znaków (bajtów). Przykładem może być wcześniej wspomniany wpisu logu (tekst) lub obrazek. Reguralnie generowane dane możemy przedstawić jako strumienie danych.&lt;/p&gt;&#xA;&lt;p&gt;Wymagania systemu ograniczają się tylko do:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;jdk 1.8+&lt;/li&gt;&#xA;&lt;li&gt;większej ilości pamięci - w zależności od wielkości przetwarzanych zasobów&lt;/li&gt;&#xA;&lt;li&gt;powierzchnia dyskowa na składowanie danych&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;przepływ-danych&#34;&gt;Przepływ danych&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/flume-schema-3.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Flum definiuje 3 parametry, które trywialnie można je opisać wg ich przeznaczenia:&lt;/p&gt;&#xA;&lt;p&gt;Source&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;konfiguracja danych wejściowych&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Channel&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;proces przetwarzania (przeskok)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Sink&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;rozdzielenie danych wyjściowych&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Składnia w pliku konfiguracyjnym&lt;/p&gt;&#xA;&lt;p&gt;Aranżacja w pliku:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;Agent&amp;gt;.sources.&amp;lt;Source&amp;gt;.&amp;lt;someProperty&amp;gt; = &amp;lt;someValue&amp;gt;&#xA;&amp;lt;Agent&amp;gt;.channel.&amp;lt;Channel&amp;gt;.&amp;lt;someProperty&amp;gt; = &amp;lt;someValue&amp;gt;&#xA;&amp;lt;Agent&amp;gt;.sources.&amp;lt;Sink&amp;gt;.&amp;lt;someProperty&amp;gt; = &amp;lt;someValue&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;podsumowanie-teorii&#34;&gt;Podsumowanie teorii&#xA;&lt;/h2&gt;&lt;p&gt;Zdarzenie Flume jest zdefiniowane jako jednostka przepływu danych posiadająca ładunek bajtów i opcjonalny zestaw atrybutów ciągu. Agent Flume to proces (JVM), który hostuje komponenty, przez które zdarzenia przepływają ze źródła zewnętrznego do następnego miejsca docelowego (przeskoku). Kropka.&lt;/p&gt;&#xA;&lt;h2 id=&#34;przygotowanie-środowiska&#34;&gt;Przygotowanie środowiska&#xA;&lt;/h2&gt;&lt;p&gt;Posłużymy się oraclowym JDK8 (opisane w poprzednich artykułach, więc nie powielamy treści) i Flume w wersji 1.9.0, gdzie możemy pobrać ze strony &lt;a class=&#34;link&#34; href=&#34;http://ftp.man.poznan.pl/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz&#34;  title=&#34;Apache Flume download ver. 1.9.0&#34;&#xA;     target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ftp.man.poznan.pl&lt;/a&gt;. Zwróćmy uwagę na weryfikację pobranych treści, ale po kolei.&lt;/p&gt;&#xA;&lt;p&gt;Po właściwej instalacji Java Developer Kit powinniśmy otrzymać wynik polecenia sprawdzającego wersje javy &lt;code&gt;java -version&lt;/code&gt; tak jak poniżej.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;java version &amp;#34;1.8.0_221&amp;#34;&#xA;Java(TM) SE Runtime Environment (build 1.8.0_221-b11)&#xA;Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Na maszynie, która będzie nam służyła jako agent tworzymy katalog &lt;code&gt;/opt-dev&lt;/code&gt; i w nim pobieramy aplikacje.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@host104:~# mkdir /opt-dev&#xA;root@host104:~# cd /opt-dev&#xA;root@host104:/opt-dev# wget http://ftp.man.poznan.pl/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz&#xA;--2019-10-21 20:54:57--  http://ftp.man.poznan.pl/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz&#xA;Resolving ftp.man.poznan.pl (ftp.man.poznan.pl)... 150.254.173.17, 2001:808::173:17&#xA;Connecting to ftp.man.poznan.pl (ftp.man.poznan.pl)|150.254.173.17|:80... connected.&#xA;HTTP request sent, awaiting response... 200 OK&#xA;Length: 67938106 (65M) [application/x-gzip]&#xA;Saving to: &amp;#39;apache-flume-1.9.0-bin.tar.gz&amp;#39;&#xA;&#xA;apache-flume-1.9.0-bin.tar 100%[======================================&amp;gt;]  64.79M  4.89MB/s    in 13s     &#xA;&#xA;2019-10-21 20:55:10 (4.86 MB/s) - &amp;#39;apache-flume-1.9.0-bin.tar.gz&amp;#39; saved [67938106/67938106]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Teraz pobieramy pliki, które posłużą nam jako zbiory do porównania pobranej binarki z flumem oraz klucz.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# wget -q http://www.apache.org/dist/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz.sha512&#xA;# wget -q http://www.apache.org/dist/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz.asc&#xA;# wget -q http://www.apache.org/dist/flume/KEYS -O asf_keys&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Korzystając z polecenia &lt;strong&gt;wget&lt;/strong&gt; posłużyliśmy się przełącznikiem &lt;strong&gt;-q&lt;/strong&gt; tylko dlatego, aby zaśmiecać wpisów zbędnymi informacjami.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;Nasz katalog powinien posiadać trzy pliki&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@host104:/opt-dev# tree -a /opt-dev/&#xA;/opt-dev/&#xA;|-- apache-flume-1.9.0-bin.tar.gz&#xA;|-- apache-flume-1.9.0-bin.tar.gz.asc&#xA;|-- apache-flume-1.9.0-bin.tar.gz.sha512&#xA;`-- asf_keys&#xA;&#xA;0 directories, 4 files&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mamy już wszystko, importujemy klucze deweloperów.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@host104:/opt-dev# gpg --import asf_keys &#xA;gpg: key CD14AD58901791C2: public key &amp;#34;Eric Sammer &amp;lt;esammer@apache.org&amp;gt;&amp;#34; imported&#xA;...&#xA;gpg: Total number processed: 9&#xA;gpg:               imported: 9&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dla każdego autora mamy zapis mówiący o zaimportowaniu &lt;code&gt;public key &amp;quot;Ktoś Tam &amp;lt;jego@e-mail&amp;gt;&amp;quot; imported&amp;quot;&lt;/code&gt; jego klucza do bazy. Zauważmy, że przy kolejnym imporcie mamy już informację, że klucz nie został ponownie dodany &lt;code&gt;not changed&lt;/code&gt; - dzieje się to w sytuacji, gdy już wcześniej w naszej bazie mieliśmy już wpis, przykład poniżej.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@host104:/opt-dev# gpg --import asf_keys &#xA;gpg: key CD14AD58901791C2: &amp;#34;Eric Sammer &amp;lt;esammer@apache.org&amp;gt;&amp;#34; not changed&#xA;...&#xA;gpg: Total number processed: 9&#xA;gpg:              unchanged: 9&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sposobów weryfikacji jest kilka i zostały opublikowane na &lt;a class=&#34;link&#34; href=&#34;http://www.apache.org/dyn/closer.lua/flume/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;stronie pobierania&lt;/a&gt;. Czas rozpakować paczkę i powinniśmy otrzymać podobną strukturę jak poniżej.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@host104:/opt-dev# tar zxf apache-flume-1.9.0-bin.tar.gz&#xA;root@host104:/opt-dev# tree -L 2 -a /opt-dev/&#xA;/opt-dev/&#xA;|-- apache-flume-1.9.0-bin&#xA;|   |-- bin&#xA;|   |-- CHANGELOG&#xA;|   |-- conf&#xA;|   |-- DEVNOTES&#xA;|   |-- doap_Flume.rdf&#xA;|   |-- docs&#xA;|   |-- lib&#xA;|   |-- LICENSE&#xA;|   |-- NOTICE&#xA;|   |-- README.md&#xA;|   |-- RELEASE-NOTES&#xA;|   `-- tools&#xA;|-- apache-flume-1.9.0-bin.tar.gz&#xA;|-- apache-flume-1.9.0-bin.tar.gz.asc&#xA;|-- apache-flume-1.9.0-bin.tar.gz.sha512&#xA;`-- asf_keys&#xA;&#xA;6 directories, 11 files&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;W katalogu &lt;code&gt;conf&lt;/code&gt; znajdują się pliki konfiguracyjne, które możemy wykorzystać. Tworzymy kopie plików z dopiskiem &lt;code&gt;.template&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# cd apache-flume-1.9.0-bin&#xA;# pwd&#xA;/opt-dev/apache-flume-1.9.0-bin&#xA;# cp conf/flume-conf.properties.template conf/flume-conf.properties&#xA;# cp conf/flume-env.ps1.template conf/flume-env.ps1&#xA;# cp conf/flume-env.sh.template conf/flume-env.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Po wskazanych działaniach zawartość katalogu konfiguracji powinna być podobna do poniższego schematu.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@host104:/opt-dev/apache-flume-1.9.0-bin# tree conf/&#xA;conf/&#xA;|-- flume-conf.properties&#xA;|-- flume-conf.properties.template&#xA;|-- flume-env.ps1&#xA;|-- flume-env.ps1.template&#xA;|-- flume-env.sh&#xA;|-- flume-env.sh.template&#xA;`-- log4j.properties&#xA;&#xA;0 directories, 7 files&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Na potrzeby tego ćwiczenie należy utworzyć strukturę katalogów na &lt;code&gt;hdfs&lt;/code&gt;. Owe miejsce będzie służyło do zapisów wyników działania flume.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# hdfs dfs -mkdir -p /bigdata/flume/cw1&#xA;# hdfs dfs -ls -R /&#xA;drwxr-xr-x   - root supergroup          0 2019-10-21 22:34 /bigdata&#xA;drwxr-xr-x   - root supergroup          0 2019-10-21 22:34 /bigdata/flume&#xA;drwxr-xr-x   - root supergroup          0 2019-10-21 22:34 /bigdata/flume/cw1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dodajemy pierwsze zapiski mówiące co i gdzie należy wrzucać dane do &lt;code&gt;flume-conf.properties&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;passion0x00.sources                              = src0x00&#xA;passion0x00.sinks                                = snk0x00&#xA;passion0x00.channels                             = chn0x00&#xA;passion0x00.sources.src0x00.channels             = chn0x00&#xA;passion0x00.sinks.snk0x00.channel                = chn0x00&#xA;passion0x00.sinks.snk0x00.type                   = HDFS&#xA;passion0x00.sinks.snk0x00.fileType               = DataStream&#xA;passion0x00.sinks.snk0x00.hdfs.path              = hdfs://h3host200.bigdatalinux.com:8020/bigdata/flume/cw1&#xA;passion0x00.sinks.snk0x00.hdfs.filePrefix        = infoout&#xA;passion0x00.sinks.snk0x00.hdfs.writeFormat       = Text&#xA;passion0x00.sinks.snk0x00.hdfs.rollInterval      = 0&#xA;passion0x00.sinks.snk0x00.hdfs.rollSize          = 0&#xA;passion0x00.sinks.snk0x00.hdfs.rollCount         = 1000&#xA;passion0x00.sinks.snk0x00.hdfs.batchSize         = 100&#xA;passion0x00.sinks.snk0x00.hdfs.useLocalTimeStamp = true&#xA;passion0x00.sinks.snk0x00.hdfs.callTimeout       = 180000&#xA;passion0x00.channels.chn0x00.type                = memory&#xA;passion0x00.channels.chn0x00.capacity            = 256&#xA;passion0x00.channels.chn0x00.transactionCapacity = 128&#xA;passion0x00.sources.src0x00.type                 = org.apache.flume.source.StressSource&#xA;passion0x00.sources.src0x00.size                 = 512&#xA;passion0x00.sources.src0x00.maxTotalEvents       = 2048&#xA;passion0x00.sources.src0x00.batchSize            = 1&#xA;passion0x00.sources.src0x00.maxEventsPerSecond   = 128 &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Powyższa konfiguracja dla danych wejściowych ustawia losowe znaki z dużym limitem, aby nie zapełnić zbędnymi danymi HDFS-a. Co prawda użyłem &lt;code&gt;org.apache.flume.source.StressSource&lt;/code&gt;, które służy do przeprowadzania testów wydajnościowych, lecz takie rozwiązanie jest najprostsze tj. out-of-the-box.&lt;/p&gt;&#xA;&lt;p&gt;Zapis następuje na katalog na Hadoopie wraz z kilkoma parametrami, które są opcjonalne. Pomocny może się okazać &lt;code&gt;passion0x00.sinks.snk0x00.hdfs.callTimeout&lt;/code&gt; w którym określamy czas oczekiwania na potwierdzenie transakcji zapisu.&lt;/p&gt;&#xA;&lt;p&gt;Pozostaje nam tylko uruchomić na kilka minut a następnie zabić agenta flume. Gdyby wystąpiły problemy z wystartowaniem usługi można się wspomóc dodatkowym przełącznikiem &lt;code&gt;flume.root.looger=DEBUG,console&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;time bin/flume-ng agent \&#xA;     -n passion0x00 -c conf \&#xA;     -f conf/flume-conf.properties&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;W katalogu &lt;code&gt;/bigdata/flume/cw1&lt;/code&gt; powinniśmy zobaczyć kilka plików.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hdfs dfs -ls /bigdata/flume/cw1&#xA;Found 3 items&#xA;-rw-r--r--   2 hdfs hdfs     531286 2019-10-22 23:31 /bigdata/flume/cw1/infoout.1571779877530&#xA;-rw-r--r--   2 hdfs hdfs     531286 2019-10-22 23:31 /bigdata/flume/cw1/infoout.1571779877531&#xA;-rw-r--r--   2 hdfs hdfs      25594 2019-10-22 23:31 /bigdata/flume/cw1/infoout.1571779877532.tmp&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;nie-działa&#34;&gt;Nie działa?&#xA;&lt;/h2&gt;&lt;p&gt;W moim przypadku miałem problemy z połączeniem do HDFS-a w wersji 3.2.1 (wydanie z 22. września 2019). Problem wynikał z m. in. z brakiem nowszej wersji pliku jar odpowiedzialnego za komunikacje z DFS. Test przeprowadzone na hadoop 2.9.2 (19. listopada 2018) dały już pożądane rezultaty. Warto zaznajomić sie z &lt;a class=&#34;link&#34; href=&#34;https://www.ietf.org/rfc/rfc2119.txt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.ietf.org/rfc/rfc2119.txt&lt;/a&gt; a następnie ze zdaniem  &lt;strong&gt;Apache Hadoop revisions SHOULD retain binary compatability such that end-user applications continue to work without any modifications&lt;/strong&gt; - to daje nam ogólny pogląd na nasze problemy :)&lt;/p&gt;&#xA;&lt;p&gt;Na zakończenie. Zadanie było wykonywane na kilku środowiskach, stąd nie należy sie sugerować nazwa hosta czy GID/UID na wylistowanych przykładach.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Poświadczenia i ogólne zasady bezpieczeństwa w AWS - wstęp</title>
            <link>https://bigdatapassion.pl/blog/po%C5%9Bwiadczenia-i-og%C3%B3lne-zasady-bezpiecze%C5%84stwa-w-aws-wst%C4%99p/</link>
            <pubDate>Fri, 19 Jul 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/po%C5%9Bwiadczenia-i-og%C3%B3lne-zasady-bezpiecze%C5%84stwa-w-aws-wst%C4%99p/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/aws/aws_cloud_security_logo.png&#34; alt=&#34;Featured image of post Poświadczenia i ogólne zasady bezpieczeństwa w AWS - wstęp&#34; /&gt;&lt;h1 id=&#34;poświadczenie&#34;&gt;Poświadczenie&#xA;&lt;/h1&gt;&lt;p&gt;Poświadczenie to pewien zestaw uprawnień obiektu, który legitymuje się przy dostępie do wybranych zasobów. Najprostszy scenariusz to przypisanie pewnemu użytkownikowi takich uprawnień, które pozwolą mu wykonać pewne operacje na pewnych zasobach.&lt;/p&gt;&#xA;&lt;h1 id=&#34;poświadczenia-bezpieczeństwa-w-aws&#34;&gt;Poświadczenia bezpieczeństwa w AWS&#xA;&lt;/h1&gt;&lt;p&gt;Dla możliwości zarządzania Amazon Web Services należy uwierzytelnić się za pomocą:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;nazwa użytkownika i hasło (do konsoli zarządzania)&lt;/li&gt;&#xA;&lt;li&gt;klucze dostępu do AWS API lub AWS CLI&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Pierwsza metoda jest dostępna przy pierwszym logowaniu. Po poprawnym zalogowaniu można rozpocząć zabezpieczanie konta i używać innych sposobów logowania. Prócz wspomnianego wyżej pierwszego sposobu (e-mail/hasło) istnieje też dostęp po kluczach do interfejsu zarządzania. Wygenerowane klucze moża dopisać do konfiguracji takich narzędzi jak np. Ansible (wraz z boto/boto2/boto3), dzięki czemu powstaje fajnie zautomatyzowane całe środowisko :).&lt;/p&gt;&#xA;&lt;p&gt;Przykładem dla Ansible może być zakładanie nowej instancji EC2 za pomocą poniższego playbooka:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;- ec2:&#xA;    key_name: marcin_gnulinux_public_key&#xA;    instance_type: t2.micro&#xA;    image: ami-numerek&#xA;    group: webserver&#xA;    wait: yes&#xA;    count: 4&#xA;    vpc_subnet_id: subnet-319fc37a&#xA;    assign_public_ip: yes&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Należy zwrócić uwagę na dbałość tzn. o bezpieczne przetrzymywanie kluczy, jeśli zapomni się lub straci dane uwierzytelniające, nie można ich już odzyskać. Nie można ich odzyskać, ale można je ponownie wygenerować :).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws/aws_cloud_security_root_vs_iam.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Poświadczenie &lt;code&gt;użytkownika root&lt;/code&gt; konta AWS jest inne niż uzyskanie poświadczenia &lt;code&gt;użytkownika IAM&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;dla konta root uzyskasz poświadczenia z Security Credentials w AWS Management Console&lt;/li&gt;&#xA;&lt;li&gt;dla kont IAM uzyskasz poświadczenia z IAM&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;typy-poświadczeń&#34;&gt;Typy poświadczeń&#xA;&lt;/h1&gt;&lt;h2 id=&#34;adres-e-mail-i-hasło&#34;&gt;Adres e-mail i hasło&#xA;&lt;/h2&gt;&lt;p&gt;Tożsamość tworzona jest przy pierwszym dostępie do konsoli AWS - podczas tworzenia konta. Tożsamość ma pełny dostęp do wszystkich usług AWS i zasobów na koncie. Nosi nazwę &lt;code&gt;Root User&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Zalecane jest nie używanie tego konta do prac administracyjnych na co dzień. Do tego celu należy utworzyć nowe konto z uprawnieniami administratora w IAM (Identity and Access Management). Po utworzeniu nowego użytkownika należy zabezpieczyć konto &lt;code&gt;root&lt;/code&gt; tak, aby korzystać z niego tylko w zarządzaniu kontem i usługami.&lt;/p&gt;&#xA;&lt;p&gt;Użytkownik &lt;code&gt;root&lt;/code&gt; posiada najwyższy poziom dokonywania zmian na koncie AWS:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Zarządzanie &lt;code&gt;Root User&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Zmiana planu AWS&lt;/li&gt;&#xA;&lt;li&gt;Edycja sposobów płatności&lt;/li&gt;&#xA;&lt;li&gt;Sprawdzanie bilingu&lt;/li&gt;&#xA;&lt;li&gt;Zgłaszanie zapytań dot. finansów&lt;/li&gt;&#xA;&lt;li&gt;Wyłączenie konta&lt;/li&gt;&#xA;&lt;li&gt;Logowanie do GovCloud&lt;/li&gt;&#xA;&lt;li&gt;Konfiguracja Reverse DNS dla EC2&lt;/li&gt;&#xA;&lt;li&gt;Tworzenie pary kluczy CloudFront&lt;/li&gt;&#xA;&lt;li&gt;Zmiana ID dla instancji EC2&lt;/li&gt;&#xA;&lt;li&gt;Konfiguracja MFA dla koszyków S3&lt;/li&gt;&#xA;&lt;li&gt;Edycja/usuwanie koszyków S3 dla VPC ID lub VPC endpoint ID&lt;/li&gt;&#xA;&lt;li&gt;Żądanie przeprowadzenia pentestów&lt;/li&gt;&#xA;&lt;li&gt;Wyłączenie ograniczenia ruchu na 25/tcp dla EC2&lt;/li&gt;&#xA;&lt;li&gt;Pokazanie w kanonicznej postaci nasz ID&lt;/li&gt;&#xA;&lt;li&gt;Przywracanie uprawnień użytkownika IAM&lt;/li&gt;&#xA;&lt;li&gt;Zmiana danych kontaktowych, waluty&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Ciekawe jest, że jako nie-root (jako użytkownik IAM) też można zażądać przeprowadzenie testów penetracyjnych, ale za pomocą e-maila. Konto &lt;code&gt;root&lt;/code&gt; potrafi to zrobić dodatkowo za pomocą web form.&lt;/p&gt;&#xA;&lt;h2 id=&#34;login-i-hasło-użytkownika-iam&#34;&gt;Login i hasło użytkownika IAM&#xA;&lt;/h2&gt;&lt;p&gt;Użytkownicy IAM podają swoje nazwy użytkowników i hasła, gdy logują się do:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;konsoli AWS Management Console&lt;/li&gt;&#xA;&lt;li&gt;forum dyskusyjnego AWS&lt;/li&gt;&#xA;&lt;li&gt;centrum wsparcia AWS&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;W niektórych przypadkach nazwa użytkownika i hasło IAM są wymagane do korzystania z usługi, takiej jak wysyłanie wiadomości e-mail za pomocą SMTP za pomocą usługi Amazon Simple Email Service (Amazon SES).&lt;/p&gt;&#xA;&lt;p&gt;Użytkownik IAM nie może dokonać zmiany hasła, chyba że otrzymał poświadczenia.&lt;/p&gt;&#xA;&lt;h2 id=&#34;multi-factor-authentication-mfa&#34;&gt;Multi-Factor Authentication (MFA)&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws/aws_cloud_security_mfa_code.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wieloetapowe uwierzytelnianie (MFA) zapewnia dodatkowy poziom bezpieczeństwa, który można zastosować (dodać) do konta AWS. Aby zapewnić dodatkowe bezpieczeństwo, zaleca się wymaganie dostępu MFA do poświadczeń użytkownika root konta AWS i wysoce uprzywilejowanych użytkowników IAM.&lt;/p&gt;&#xA;&lt;p&gt;Po włączeniu MFA, po zalogowaniu się na stronie AWS pojawi się monit o podanie nazwy użytkownika i hasła oraz kodu uwierzytelniającego z urządzenia MFA co zapewnia większe bezpieczeństwo ustawień konta AWS i zasobów. Domyślnie MFA nie jest włączone.&lt;/p&gt;&#xA;&lt;p&gt;Limit na ilość urządzeń MFA na dla użytkownika IAM i konto root wynosi: 1&lt;/p&gt;&#xA;&lt;h2 id=&#34;access-keys-access-key-id-and-secret-access-key&#34;&gt;Access Keys (Access Key ID and Secret Access Key)&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws/aws_cloud_security_a_set_of_keys.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Klucze dostępu składają się z dwóch części:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;identyfikator klucza dostępu (na przykład AKIAIOSFODNN7EXAMPLE)&lt;/li&gt;&#xA;&lt;li&gt;tajny klucz dostępu (na przykład wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws/aws_cloud_security_access_key_secret_list.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Używamy ich do:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;podpisywania żądań programowych komend AWS CLI (używając SDK)&lt;/li&gt;&#xA;&lt;li&gt;autoryzacji przy korzystaniu z interfejsu  AWS API&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Do Uwierzytelnienia żądań należy użyć:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;identyfikatora klucza dostępu&lt;/li&gt;&#xA;&lt;li&gt;tajnego klucza dostępu&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Podczas tworzenia kluczy dostępu tworzymy zestaw składający się z:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;identyfikator klucza dostępu&lt;/li&gt;&#xA;&lt;li&gt;tajny klucz dostępu&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tylko przy tworzeniu mamy możliwość pobrania części klucza dostępu (tajnego klucza dostępu). Nie ma możliwości ponownego zobaczenia tych danych, wtedy należy ponownie wygenerować zestaw kluczy dostępu.&lt;/p&gt;&#xA;&lt;p&gt;W przypadku zagubienia tych informacji też tworzymy ponownie zestaw kluczy. Nowo utworzony klucz ma status aktywny tj. można z niego korzystać a więc posługiwać się nim w komunikacji z AWS API lub za pomocą AWS CLI.&lt;/p&gt;&#xA;&lt;p&gt;Dla głównego użytkownika root można przypisać maksymalnie dwa klucze. Nawet wyłączony (nieaktywny) klucz wlicza się do limitu.&lt;/p&gt;&#xA;&lt;p&gt;Istnieją tymczasowe klucze dostępu - tymczasowe poświadczenia bezpieczeństwa. Oprócz identyfikatora klucza dostępu i tajnego klucza dostępu tymczasowe poświadczenia bezpieczeństwa obejmują token bezpieczeństwa, który należy wysłać do AWS podczas korzystania z tymczasowych poświadczeń bezpieczeństwa.&lt;/p&gt;&#xA;&lt;p&gt;Zaletą tymczasowych poświadczeń bezpieczeństwa jest to, że są one krótkoterminowe. Po wygaśnięciu nie są już ważne. Można używać tymczasowych kluczy dostępu w mniej bezpiecznych środowiskach lub rozpowszechniać je, aby zapewnić użytkownikom tymczasowy dostęp do zasobów na koncie AWS.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-pairs&#34;&gt;Key Pairs&#xA;&lt;/h2&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws/aws_cloud_security_public_private_keys.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Pary kluczy&lt;/code&gt; nie są powiązane z &lt;code&gt;kluczami dostępu&lt;/code&gt;. Składają się z klucza publicznego i klucza prywatnego.&lt;/p&gt;&#xA;&lt;p&gt;Do utworzenia podpisu cyfrowego używamy klucza prywatnego, a następnie AWS używa odpowiedniego klucza publicznego do sprawdzenia poprawności podpisu.&lt;/p&gt;&#xA;&lt;p&gt;Pary kluczy są używane tylko dla:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Amazon EC2&lt;/li&gt;&#xA;&lt;li&gt;Amazon CloudFront&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dla &lt;code&gt;EC2&lt;/code&gt; używamy do dostępu do instancji po SSH.&lt;/p&gt;&#xA;&lt;p&gt;Dla &lt;code&gt;CloudFront&lt;/code&gt; do tworzenia podpisanych adresów URL dla treści prywatnych. Dla przykładu gdy chcemy rozpowszechniać treść, za którą ktoś zapłacił.&lt;/p&gt;&#xA;&lt;p&gt;AWS nie udostępnia par kluczy dla naszego konta - musimy je stworzyć. Tylko użytkownik root konta AWS może tworzyć pary kluczy &lt;code&gt;CloudFront&lt;/code&gt;.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Alibaba Cloud - duży gracz na rynku Cloud Computing</title>
            <link>https://bigdatapassion.pl/blog/alibaba-cloud-du%C5%BCy-gracz-na-rynku-cloud-computing/</link>
            <pubDate>Sat, 15 Jun 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/alibaba-cloud-du%C5%BCy-gracz-na-rynku-cloud-computing/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-logo.png&#34; alt=&#34;Featured image of post Alibaba Cloud - duży gracz na rynku Cloud Computing&#34; /&gt;&lt;h3 id=&#34;kilka-słów-o-alibaba-group&#34;&gt;Kilka słów o Alibaba Group&#xA;&lt;/h3&gt;&lt;p&gt;Grupa Alibaba powstała w 1999 roku. Obecnie zatrudnia ok. 93 tyś. pracowników. Nazwa firmy pochodzi od Ali Baby - postać z bliskowschodniej kolekcji opowiadań ludowych &lt;em&gt;One Thousand and One Nights&lt;/em&gt; i powstała ze względu na jej uniwersalny wygląd. Logo Grupy (źródło: &lt;a class=&#34;link&#34; href=&#34;https://www.alibabagroup.com/en/global/home&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.alibabagroup.com/en/global/home&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-global-home.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;kilka-słów-o-alibaba-cloud-aliyun--alicloud&#34;&gt;Kilka słów o Alibaba Cloud (Aliyun / AliCloud)&#xA;&lt;/h3&gt;&lt;p&gt;Niebawem dziesięciolecie (wrzesień 2019) platformy Alibaba Cloud. Platforma chmury obliczeniowej Alibaba ma ponad 50% udziału w rynku w Chinach (luty 2019, źródło: &lt;a class=&#34;link&#34; href=&#34;https://www.fool.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.fool.com&lt;/a&gt;). Logo firmy zapisane w języku ojczystym:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-calligraphical-chinese-characters.jpg&#34;&gt;&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Usługi Cloud dostępne są dla nas od 2014 roku a w listopadzie 2016 powstał pierwszy w Europie rejon w Frankfurcie.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;ważniejsze-usługi&#34;&gt;Ważniejsze usługi&#xA;&lt;/h3&gt;&lt;p&gt;W skrócie jak wyglądają oferta Alibaba Cloud.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Gałąź technologi&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Opis&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Elastic Computing&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Usługi wykorzystujące moce obliczeniowe, równoważenie obciążenia, (zaawansowane) możliwości sieciowe&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Storage &amp;amp; CDN&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Przechowuje i udostępnia duże ilość danych i obiektów za pomocą zarządzanych produktów do przechowywania i dostarczania treści&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Networking&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Twórz i zabezpieczaj sieci dla swoich usług (np. Cloud VPC, ExpressConnect&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Database Services&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Zarządzanie bazami danych&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Security&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Ochrona danych, aplikacji i serwerów przed złośliwymi atakami&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Monitoring &amp;amp; Management&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Zarządzaj i monitoruj w czasie rzeczywistym dedykowanymi do tego narzędziami&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Domains &amp;amp; Website&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Obsługa domen i DNSa Alibaba Cloud&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;strong&gt;Analytics &amp;amp; Big Data&lt;/strong&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Narzędzia do analityki hurtowni danych, analiza biznesowa, przetwarzanie wsadowe, przetwarzanie strumieniowe, uczenie maszynowe i rozwiązania Big Data&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Application Service&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Komponenty i narzędzia do zarządzania i tworzenia aplikacji i zarządzanie nimi&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Media Services&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Platforma to przetwarzania dźwięku i obrazu (video)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Middleware&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Rozwiązania mikroserwisowe i wdrażanie aplikacji&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Cloud Communication&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Usługa &lt;em&gt;Short Message Service&lt;/em&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apsara Stack&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Połączenie naszego onpremisowego środowiska z Alibabą&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Internet of Things&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dwa narzędzia &lt;em&gt;IoT Platform&lt;/em&gt; i &lt;em&gt;IoV Command Center&lt;/em&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;rozpoczęcie-pracy---tworzenie-konta&#34;&gt;Rozpoczęcie pracy - tworzenie konta&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-09.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Możemy utworzyć konto na dwa sposoby:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;za pomocą witryny internetowej&lt;/li&gt;&#xA;&lt;li&gt;za pomocą aplikacji&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dzisiaj utworzymy sobie konto pierwszym sposobem (za pośrednictwem strony www). Przy rejestracji na pierwszym ekranie uzupełniamy:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Pole&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Wartość&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Uwagi&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Kraj&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Poland&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Należy mieć na uwadze, że po zatwierdzeniu naszego wyboru nie ma możliwości zmiany tego parametru&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Email&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;mailto:marcin@gnulinux.pl&#34; &gt;marcin@gnulinux.pl&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Zostanie wysłana informacja o rejestracji&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Password&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;tAJn3_Haa$#o7_max20&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Maksymalnie 20 znaków :/&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Confirm&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;tAJn3_Haa$#o7_max20&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Potwierdzamy wpisując ponownie to samo hasło&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Należy pamiętać o wyrażeniu zgody - zatwierdzeniu regulaminu.&lt;/p&gt;&#xA;&lt;p&gt;Po zatwierdzeniu wyświetli nam się okienko z prośbą o przepisanie sześcio-cyfrowego kody weryfikującego poprawność naszego adresu e-mail. Po weryfikacji otrzymamy kolejnego maila z informacją o utworzeniu konta.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-login-sigin-02.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Już od teraz mamy dostęp do konsoli Alibaba Cloud. Kolejnym etapem będzie włączenie:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;wieloetapowej autoryzacji (MFA)&lt;/li&gt;&#xA;&lt;li&gt;ograniczenie dostępu do konsoli na podstawie listy dozwolonych adresów IP&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;weryfikacja-totp&#34;&gt;Weryfikacja TOTP&#xA;&lt;/h3&gt;&lt;p&gt;W prawym górnym rogu strony www wybieramy z menu &lt;strong&gt;Account Management&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-login-sigin-05.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wieloetapowa autoryzacja (MFA) tutaj widnieje w pozycji &lt;strong&gt;Account Protection&lt;/strong&gt; jako &lt;strong&gt;weryfikacja TOTP&lt;/strong&gt; (Time-based One-Time Password algorithm).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-03.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Opisywana konfiguracja zwiększa bezpieczeństwo. Polega na dodaniu do naszej aplikacji na telefonie / tablecie / laptopie / komputerze / pralce kodu (który jest ciągiem znaków znanym tylko Tobie i serwerowi). W większości przypadków nasza aplikacja zeskanuje obrazek z kodem QR w którym jest zawarty wspomniany kod. W przypadku problemów (zeskanowanie kodu jest niemożliwe lub aplikacja kliencka nie ma takiej funkcjonalności) można go przepisać. Otrzymany w ten sposób wpis w naszej aplikacji generuje kod autoryzacyjny co 30 sekund i powstaje z kodu oraz bieżącego znacznika czasu.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Uogólniając:&lt;/p&gt;&#xA;&lt;p&gt;qwertyKODqwerty + 1234CZAS56789 = 123456&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;Generowanie odbywa się jednocześnie po stronie klienta (nas) jak i po stronie serwera (usługi do której się logujemy).  Większość aplikacji generuje 6-cio cyfrowy ciąg znaków, lecz jest możliwość otrzymania ośmio-cyfrowej kombinacji (zależy to od konfiguracji usługi przez serwis). Na urządzenia mobilne polecam aplikację FreeOTP, ponieważ:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Open Source&lt;/li&gt;&#xA;&lt;li&gt;obsługa HOTP i TOTP&lt;/li&gt;&#xA;&lt;li&gt;dodawanie za pomocą kodu QR lub wpisanie kodu ręcznie&lt;/li&gt;&#xA;&lt;li&gt;licencja Apache 2.0&lt;/li&gt;&#xA;&lt;li&gt;wspierany przez Red Hat-a&lt;/li&gt;&#xA;&lt;li&gt;wspiera iOS-a i Android-a&lt;/li&gt;&#xA;&lt;li&gt;klarowny interfejs i intuicyjna obsługa&lt;/li&gt;&#xA;&lt;li&gt;więcej w repo: &lt;a class=&#34;link&#34; href=&#34;https://github.com/freeotp&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/freeotp&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Osoby zaciekawione tematem zachęcam do lektury (kolejność losowa):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://tools.ietf.org/html/rfc1321&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://tools.ietf.org/html/rfc1321&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://tools.ietf.org/html/rfc2104&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://tools.ietf.org/html/rfc2104&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://tools.ietf.org/html/rfc4226&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://tools.ietf.org/html/rfc4226&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://tools.ietf.org/html/draft-mraihi-totp-timebased-08&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://tools.ietf.org/html/draft-mraihi-totp-timebased-08&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;włączenie-dodatkowej-ochrony&#34;&gt;Włączenie dodatkowej ochrony&#xA;&lt;/h4&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-reg-verification-code-01.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W &lt;strong&gt;Account Protection&lt;/strong&gt; wybieramy &lt;strong&gt;Edit&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-03.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W formularzu zaznaczamy poniższe opcje:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-08.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Obszary&lt;/strong&gt; wymagające ochrony&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;logowanie do konta&lt;/li&gt;&#xA;&lt;li&gt;zmiana danych konta&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;strong&gt;Metoda&lt;/strong&gt; weryfikacji&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;TOTP&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Istnieje możliwość weryfikacji za pomocą kodu SMS, lecz owe rozwiązanie (w mojej ocenie) jest zawodne i mniej bezpieczne.&lt;/p&gt;&#xA;&lt;p&gt;Po otrzymanie komunikatu o podobnej treści:&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Verification in progress &lt;a class=&#34;link&#34; href=&#34;mailto:m%5e%5e%5e%5e@gnulinux.pl&#34; &gt;m^^^^@gnulinux.pl&lt;/a&gt; Enable TOTP Please select the method of verification&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;Wybieramy &lt;strong&gt;By Email Verification&lt;/strong&gt;. Na poczcie otrzymamy sześcio-cyfrowy kod, który przepisujemy do interfejsu webowego i zatwierdzamy klawiszem &lt;strong&gt;Submit&lt;/strong&gt;.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Jeśli wcześniej podaliśmy numer telefony to automatycznie pojawi się dodatkowa możliwość weryfikacji za pomocą SMS-a (zdjęcie poniżej)&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-07.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na kolejnym ekranie jest propozycja zainstalowania &lt;em&gt;Google Authenticator&lt;/em&gt;, lecz pomijamy ten krok (mając zainstalowaną inną aplikację obsługującą TOTP, np FreeOTP) wybierając &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-06.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Kolejny ekran wyświetli nam &lt;strong&gt;kod QR&lt;/strong&gt; oraz możliwość wpisania &lt;em&gt;z palca&lt;/em&gt; kodu - opcja znajduje się pod niebieskim linkiem &lt;strong&gt;Scan failed?&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-05.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zeskanowaniu QR-a (dodaniu do aplikacji) należy przepisać wygenerowany kod i zatwierdzić.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-04.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Konfiguracja zakończona. Od teraz przy każdym logowaniu będą wymagane poniższe dane:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;login (e-mail)&lt;/li&gt;&#xA;&lt;li&gt;hasło (podane przy rejestracji)&lt;/li&gt;&#xA;&lt;li&gt;sześcio-cyfrowy ciąg znaków z aplikacji&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-login-sigin-01.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-login-sigin-03.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;zaufane-adresy-ip&#34;&gt;Zaufane adresy IP&#xA;&lt;/h3&gt;&lt;p&gt;Chcąc zwiększyć swoje bezpieczeństwo podczas prób logowania dodatkowo należy podać listę adresów IP. Owe adresy pozwolą na zalogowanie się do konsoli (interfejsu webowego). Konfiguracja jest bardzo prosta i ogranicza się do podania jednego / wielu adresów oddzielonych średnikiem (;).&lt;/p&gt;&#xA;&lt;p&gt;Tak jak wcześniej w prawym górnym rogu strony www wybieramy z menu &lt;strong&gt;Account Management&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-login-sigin-05.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy &lt;strong&gt;Set&lt;/strong&gt; w pozycji opisanej jako &lt;strong&gt;Login Mask&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-totp-01.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Zgodnie z instrukcją w pole wpisujemy nasze adresy IP z których jesteśmy widoczni w sieci.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Zwróć uwagę, że przy zmiennym IP w domu po zmianie przez ISP Twojego adresu logowanie nie będzie możliwe.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/alibaba/m190615-alibaba-login-sigin-04.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tutaj proponuję wpisać kilka adresów, aby ustrzec się przed odcięciem sobie możliwości zalogowania.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Adres IP z domku (jeśli mamy stałe zewnętrzne IP)&lt;/li&gt;&#xA;&lt;li&gt;Adres IP / pula adresów z naszej firmy (jeśli takowe posiada)&lt;/li&gt;&#xA;&lt;li&gt;Adresy IP kilku naszych VPS-ów / serwerów dedykowanych&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Teraz wystarczy zatwierdzić i zmianą są już widoczne w panelu.&lt;/p&gt;&#xA;&lt;h3 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h3&gt;&lt;p&gt;Krótko: Alibaba Cloud to ciekawa konkurencja dla innych dużych dostawców.&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym artykule zrobimy podłączenie konta PayPal.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Relacja z konferencji Oracle Cloud Day w Warszawie</title>
            <link>https://bigdatapassion.pl/blog/relacja-z-konferencji-oracle-cloud-day-w-warszawie/</link>
            <pubDate>Wed, 12 Jun 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/relacja-z-konferencji-oracle-cloud-day-w-warszawie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-0002.png&#34; alt=&#34;Featured image of post Relacja z konferencji Oracle Cloud Day w Warszawie&#34; /&gt;&lt;p&gt;21 maja 2019 roku byliśmy na konferencji o chmurze zorganizowanej przez Oracle. Nie sposób było być na każdej z czterech ścieżek tematycznych w całości, ale się staraliśmy :)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-0003.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Konforencję otworzył&lt;/strong&gt; Pan Piotr Witczyński (Vice President Consulting Eastern Europe &amp;amp; CIS). Z ciekawostek w 2013 roku po 5-letniej kadencji został ponownie powołany na dyrektora generalnego. Jego współpraca z firmą Oracle trwa już 20 lat.&lt;/p&gt;&#xA;&lt;p&gt;Do przerwy obiadowej (11:30) na sesji plenarnej mieliśmy okazje wysłuchać:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Temat wystąpienia&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Prelegent&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;The future is autonomus&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-andrew-sutherland-0001.png&#34;&gt; &lt;strong&gt;Andrew Sutherland&lt;/strong&gt; (dołączył do firmy w 1995 roku)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Automatyzacja śledzenia postępów w projektach budowlanych&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-pawel-kobojek-0001.png&#34;&gt;  &lt;strong&gt;Paweł Kobojek&lt;/strong&gt; (AI Leader, AI Clearing, ponad 30 lat doświadczenia)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Sztuczna inteligencja czym jest, jak z sukcesem wdrożyć i odzyskać wartość&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-andrzej-wodecki-0001.jpg&#34;&gt; &lt;strong&gt;dr Andrzej Wodecki&lt;/strong&gt; (adiunkt na PW na Wydziale Zarządzania)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Po smacznej uczcie dla ciała a dla ducha rozmowach rozpoczęły się 4 ścieżki:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Sesja biznesowa&lt;/li&gt;&#xA;&lt;li&gt;Sesja techniczna&lt;/li&gt;&#xA;&lt;li&gt;Warsztaty&lt;/li&gt;&#xA;&lt;li&gt;Aplikacje&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-0004.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Najbardziej zaciekawiły mnie oczywiście &lt;strong&gt;warsztaty&lt;/strong&gt;, gdzie znalazłem dla siebie miejsce spośród +50 innych uczestników. Tematem naszych zmagań przed laptopami było &lt;strong&gt;tworzenie aplikacji &amp;ldquo;Cloud Native&amp;rdquo; w Oracle Cloud Infrastructure&lt;/strong&gt;. Podczas wykonywania ćwiczeń można zaobserwować mnogość usług i możliwości co bardzo mnie uskrzydla - lubię wiedzieć:). Początek był bardzo prosty, lecz później zaczęły się schody. Na warsztatach było pięć tematów do rozwiązania:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lab 100: Konfiguracja środowiska deweloperskiego z użyciem github i Wercker&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-00021.png&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lab 200: Tworzenie klastra k8s i utworzenie CI/CD dla wypychania aplikacji&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-00022.png&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lab 300: Poprawianie błędów (bug fix) w aplikacji&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-00023.png&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lab 400: Wprowadzenie nowych wersji aplikacji stosując wzorzec &amp;ldquo;blue-green&amp;rdquo;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-00024.png&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lab 500: Rozszerzanie aplikacji o nowe funkcje&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-00025.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Duża liczba osób zainteresowanych warsztatami i ograniczony czas nie pozwolił wykonać wszystkich ćwiczeń. Ruszyłem na pozostałe prelekcje, aby nic mnie nie ominęło. Obojętnie obok rozrywki nigdy nie przejdę, można było np. podziwiać na torze samochodziki - autonomiczne mini autka czy podziwiać budowle - model inteligentnego miasta zbudowany z klocków Lego :)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190612-oracle-cloud-day-2019-warsaw-0005.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Konferencja miała dodatkowy plus - networking, a dzięki spotkaniu i porozmawianiu z kilkoma ciekawymi osobami otworzyły się ciekawe pomysły na lepsze wykorzystanie chmur.&lt;/p&gt;&#xA;&lt;h3 id=&#34;żródła&#34;&gt;Żródła&#xA;&lt;/h3&gt;&lt;p&gt;Część materiałów (zdjęcia) zostały pobrane ze strony &lt;a class=&#34;link&#34; href=&#34;https://oracle.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://oracle.com&lt;/a&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Big Data i sztuczna inteligencja na konferencji Confitura 2019</title>
            <link>https://bigdatapassion.pl/blog/big-data-i-sztuczna-inteligencja-na-konferencji-confitura-2019/</link>
            <pubDate>Wed, 05 Jun 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-i-sztuczna-inteligencja-na-konferencji-confitura-2019/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/confitura-2019.jpg&#34; alt=&#34;Featured image of post Big Data i sztuczna inteligencja na konferencji Confitura 2019&#34; /&gt;&lt;p&gt;Po raz kolejny odbywać się będzie jedna z największych i moim zdaniem zarazem najlepszych polskich konferencji, czyli &lt;a class=&#34;link&#34; href=&#34;https://2019.confitura.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Confitura&lt;/strong&gt;&lt;/a&gt;. Po raz drugi będzie miała specjalną oddzielną ścieżkę &lt;strong&gt;Big Data and Artificial Intelligence&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Confitura&lt;/strong&gt; jest konferencją poświęconą środowisku Java, stąd jest znana przede wszystkim programistom wykorzystującym do swej pracy &lt;em&gt;Maszynę Wirtualną Java&lt;/em&gt;, czyli np. programistom takich języków jak Java, Scala, Kotlin czy Groovy. Wcześniej konferencja znana była pod nazwą &lt;strong&gt;Javarsowia&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ścieżka &lt;strong&gt;Big Data and Artificial Intelligence&lt;/strong&gt; pojawia się na niej po raz pierwszy w 2018 roku i na tyle dobrze została przyjęta że tradycja jest kontynuowana. To bardzo dobra wiadomość, gdyż coraz więcej uczestników konferencji to osoby pracujące na codzień z rozwiązaniami Big Data jako inżynierowie danych, data scientists oraz data architekci.&lt;/p&gt;&#xA;&lt;p&gt;Tych co nigdy nie byli na &lt;em&gt;Confiturze&lt;/em&gt;, gorąco zachęcam do udziału. Konferencja jest &lt;strong&gt;darmowa&lt;/strong&gt;, jednak z powodu ogromnej liczby chętnych, wprowadzono licytacje drobnych cegiełek charytatywnych w zamian za możliwość otrzymania biletu wstępu.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli chcielibyście zobaczyć jak było na poprzednich edycjach, polecam kanał konferencji na &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/user/confiturapl&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;YouTube&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Zapraszam także przy okazji na moją prezentację poświęconej Kafka Streams :)&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Przegląd narzędzi i bibliotek do data science i sztucznej inteligencji (beta)</title>
            <link>https://bigdatapassion.pl/blog/przegl%C4%85d-narz%C4%99dzi-i-bibliotek-do-data-science-i-sztucznej-inteligencji-beta/</link>
            <pubDate>Thu, 30 May 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/przegl%C4%85d-narz%C4%99dzi-i-bibliotek-do-data-science-i-sztucznej-inteligencji-beta/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/ai/silver-surfer-3499405_640.jpg&#34; alt=&#34;Featured image of post Przegląd narzędzi i bibliotek do data science i sztucznej inteligencji (beta)&#34; /&gt;&lt;p&gt;Wraz ze wzrostem popularności rozwiązań Data Science i Sztucznej Inteligencji, coraz więcej ludzi poszukuje odpowiednich bibliotek i narzędzi pozwalających realizować takie projekty.&lt;/p&gt;&#xA;&lt;p&gt;Postanowiłem podzielić się swoją listą narzędzi i bibliotek które można użyć w tego typu projektach. Jeśli ktoś woli format arkusza, lista jest dostępna także &lt;a class=&#34;link&#34; href=&#34;https://docs.google.com/spreadsheets/d/1w5_1cXrOcDpRZcey4fv3_wJKLmekmnQnEjrcTL8jggs/edit?usp=sharing&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tutaj&lt;/a&gt;. Jeśli uważasz, że warto dodać do tej listy jakieś narzędzie, proszę o informację na maila lub komentarz pod wpisem lub w arkuszu.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Nazwa&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Strona&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Kod żródłowy&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Komentarz&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Opis&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apache FlinkML&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://flink.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/apache/flink&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Szybko rosnąca popularność&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Machine Learning (ML) library for Flink&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apache Hivemall&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://hivemall.incubator.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/apache/incubator-hivemall&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Inkubacja&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Hivemall is a scalable machine learning library that runs on Apache Hive, Spark and Pig.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apache Mahout&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://mahout.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/apache/mahout&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Free implementations of distributed or otherwise scalable machine learning algorithms&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apache MXNet&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://mxnet.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/apache/incubator-mxnet&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Inkubacja, szybko rosnąca popularność&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apache OpenNLP&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://opennlp.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Bardzo popularna&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;The Apache OpenNLP library is a machine learning based toolkit for the processing of natural language text&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apache SINGA&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://singa.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/apache/incubator-singa&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apache Spark -&amp;gt; Databricks Deep Learning Pipelines for Apache Spark&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://databricks.github.io/spark-deep-learning/docs/_site/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Apache Spark -&amp;gt; MLlib&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/mllib/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/apache/spark/tree/master/mllib&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Bardzo popularna&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;MLlib is Apache Spark&amp;rsquo;s scalable machine learning library.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Caffe&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://caffe.berkeleyvision.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/BVLC/caffe&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Caffe2&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://caffe2.ai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pytorch/pytorch/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Bardzo popularna&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Convolutional Architecture for Fast Feature Embedding. A New Lightweight, Modular, and Scalable Deep Learning Framework&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;CatBoost&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://catboost.ai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/catboost/catboost&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Chainer&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://chainer.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/chainer/chainer&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Chainer is an open source deep learning framework written purely in Python on top of Numpy and CuPy Python libraries&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;DeepLearning4J&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://deeplearning4j.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/deeplearning4j/deeplearning4j&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Deep learning programming library written for Java and the Java virtual machine (JVM)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Elephas&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://maxpumperla.com/elephas/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Distributed Deep Learning with Keras &amp;amp; Spark&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Gluon&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/gluon-api/gluon-api/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A clear, concise, simple yet powerful and efficient API for deep learning.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;H2O&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.h2o.ai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/h2oai/h2o-3&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Bardzo popularna&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Data Science and Machine Learning Platform&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Horovod&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://eng.uber.com/horovod/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/horovod/horovod&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Distributed training framework for TensorFlow, Keras, PyTorch, and MXNet.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Intel Analytics Zoo&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://analytics-zoo.github.io/master/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/intel-analytics/analytics-zoo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A unified analytics + AI platform for distributed TensorFlow, Keras and BigDL on Apache Spark&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Intel BigDL&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdl-project.github.io/0.7.0/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/intel-analytics/BigDL&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;BigDL is a distributed deep learning library for Apache Spark&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Intel Data Analytics Acceleration Library (Intel DAAL)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Intel Math Kernel Library (Intel MKL)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Keras&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://keras.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/keras-team/keras&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Bardzo popularna&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Keras is a high-level neural networks API, written in Python and capable of running on top of TensorFlow, CNTK, or Theano.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Keras -&amp;gt; Cern Distributed Keras&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://joerihermans.com/work/distributed-keras/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Nie rozwijana&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;MATLAB&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.mathworks.com/products/matlab.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Laboratorium Macierzy (MatrixLaboratory)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Microsoft Cognitive Toolkit (CNTK)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Natural Language Toolkit (NLTK)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.nltk.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;zestaw bibliotek i programów do symbolicznego i statystycznego przetwarzania języka naturalnego&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Neural Designer&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ONNX (Open Neural Network Exchange)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;OpenNN&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.opennn.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;OpenNN is a free neural networks library for advanced analytics.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;PyTorch&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://pytorch.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/pytorch/pytorch&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Bardzo popularna&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;An open source deep learning platform that provides a seamless path from research prototyping to production deployment.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;PyTorch -&amp;gt; AllenNLP&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://allennlp.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;R Project&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.r-project.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Popularny, traci na rzecz Pythona i innych języków&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;R is a free software environment for statistical computing and graphics&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Scikit-learn&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://scikit-learn.org/stable/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Machine Learning in Python&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SciPy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.scipy.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Python library used for scientific computing and technical computing&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SciPy -&amp;gt; IPython&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://ipython.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A powerful interactive shell. A kernel for Jupyter.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SciPy -&amp;gt; Matplotlib&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://matplotlib.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;biblioteka do tworzenia wykresów dla języka programowania Python i jego rozszerzenia numerycznego NumPy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SciPy -&amp;gt; NumPy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.numpy.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;NumPy is the fundamental package for scientific computing with Python&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SciPy -&amp;gt; Pandas&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://pandas.pydata.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;library written for the Python programming language for data manipulation and analysis&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SciPy -&amp;gt; Sympy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.sympy.org/en/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SymPy is a Python library for symbolic mathematics.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;SciPy library&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.scipy.org/scipylib/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;The SciPy library is one of the core packages that make up the SciPy stack&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;TensorFlow&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.tensorflow.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/tensorflow/tensorflow&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Bardzo popularna&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;TensorFlow -&amp;gt; Yahoo TensorFlowOnSpark&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/yahoo/TensorFlowOnSpark&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Theano&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.deeplearning.net/software/theano/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/Theano/Theano&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Nie rozwijana&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Theano is a Python library that allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Torch&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;http://torch.ch/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/torch/torch7&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Nie rozwijana&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;A scientific computing framework for LuaJIT&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;XGBoost&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://xgboost.ai/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/dmlc/xgboost&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;XGBoost is an optimized distributed gradient boosting library designed to be highly efficient, flexible and portable.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;</description>
        </item><item>
            <title>Wprowadzenie weryfikacji wieloetapowej w Oracle Cloud</title>
            <link>https://bigdatapassion.pl/blog/wprowadzenie-weryfikacji-wieloetapowej-w-oracle-cloud/</link>
            <pubDate>Mon, 20 May 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wprowadzenie-weryfikacji-wieloetapowej-w-oracle-cloud/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190520-oracle-mfa-totp-schema-logo.png&#34; alt=&#34;Featured image of post Wprowadzenie weryfikacji wieloetapowej w Oracle Cloud&#34; /&gt;&lt;h1 id=&#34;dlaczego-potrzebujemy-wielopoziomowej-autoryzacji&#34;&gt;Dlaczego potrzebujemy wielopoziomowej autoryzacji?&#xA;&lt;/h1&gt;&lt;p&gt;W obecnych czasach ochrona za pomocą loginu i hasła nie jest już wystarczająco bezpiecznym sposobem dostępu do naszych usług. Wykradzione hasło daje dostęp osobom nieupoważnionym co kompromituje nasze dane. Właściwym zwiększeniem naszego spokoju jest np. wprowadzenie dodatkowej warstwy zabezpieczającej w postaci dwu etapowej autoryzacji. Dobrym sposobem jest &lt;strong&gt;uwierzytelnianie wielopoziomowe&lt;/strong&gt; (multi-factor authentication MFA) za pomocą &lt;strong&gt;algorytmu TOTP&lt;/strong&gt; (Time-based One-Time Password). Polega to na zalogowaniu się za pomocą loginu i hasła w kolejnym kroku wpisaniu tokena wygenerowanego przez aplikację / klucz sprzętowy. Rozwiązanie to wprowadza 2-warstwową autoryzację co znacząco utrudnia próbę przejęcia konta.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190520-oracle-mfa-totp-schema.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Token możemy otrzymać za pomocą SMS-a, e-maila lub z aplikacji zainstalowanej na telefonie czy tablecie. Ja używam i polecam &lt;strong&gt;FreeOTP&lt;/strong&gt; (&lt;a class=&#34;link&#34; href=&#34;https://freeotp.github.io/%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://freeotp.github.io/)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190520-oracle-mfa-totp-step-06.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;włączenie-wieloetapowej-autoryzacji-w-oracle-cloud&#34;&gt;Włączenie wieloetapowej autoryzacji w Oracle Cloud&#xA;&lt;/h1&gt;&lt;p&gt;Korzystając z menu burger (lewy górny róg strony) kolejno przechodzimy do ostatniej zakładki &lt;code&gt;Governance and Administration&lt;/code&gt; a w niej &lt;code&gt;Identity&lt;/code&gt; i &lt;code&gt; Users&lt;/code&gt;. Wybieramy konto, które będzie używać dodatkowego zabezpieczenia logowania do naszego konta: klikamy na naszą nazwę lub wybieramy z menu &lt;code&gt;...&lt;/code&gt; pierwszą opcję &lt;code&gt;View User Details&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190520-oracle-mfa-totp-step-01.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy &lt;code&gt;Enable Multi-Factor Authentication&lt;/code&gt; i ukazuje nam się okienko z kodem QR oraz polem do wpisania wygenerowanego kodu.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190520-oracle-mfa-totp-step-02.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Za pomocą aplikacji skanujemy kod QR (niebieska ikonka kodu QR tuż obok ikonki plusa).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190520-oracle-mfa-totp-step-07.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Należy pamiętać, że raz wygenerowany kod QR nie można ponownie wyświetlić. Dla zachowania &amp;lsquo;HA&amp;rsquo; robimy też skan na innym urządzeniu i w razie utraty / awarii jednego z nich nie tracimy dostępu do chmury.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m190520-oracle-mfa-totp-step-08.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zeskanowaniu uruchamiamy token stukając w jego ikonkę.&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Nie należy się przejmować jeśli w ciągu 30 sekund nie zdążymy przepisać i zatwierdzić 6-cio cyfrowego kodu, ponieważ jest margines czasu, który zezwala na zatwierdzenie kodu po jego zniknięciu z naszego ekranu.&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;Mamy już zaimportowaną konfigurację na nasze urządzenia, teraz należy potwierdzić włączenie MFA przepisując wygenerowany kod do interfejsu Chmury Oracle i zatwierdzić wybór.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Big Data Compute Edition w Oracle Cloud - część 2</title>
            <link>https://bigdatapassion.pl/blog/big-data-compute-edition-w-oracle-cloud-cz%C4%99%C5%9B%C4%87-2/</link>
            <pubDate>Thu, 25 Apr 2019 09:20:00 +0100</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-compute-edition-w-oracle-cloud-cz%C4%99%C5%9B%C4%87-2/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/oraclecloud/m-oracle-cloud-logo-official-website.png&#34; alt=&#34;Featured image of post Big Data Compute Edition w Oracle Cloud - część 2&#34; /&gt;&lt;p&gt;Korzystamy z burger-menu (lewy górny róg strony).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-object-storage-menu-13.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy kolejno (tak jak na rysunku poniżej)&lt;/p&gt;&#xA;&lt;p&gt;Burger Menu zakładka &lt;code&gt;Solutions Platform and Edge&lt;/code&gt; &lt;code&gt;My Service Dashboard&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Zostaniemy przekierowani na inny interfejs graficzny podobny do tego&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-30.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W lewym górnym rogu jest Burger Menu w którym kolejno wybieramy&lt;/p&gt;&#xA;&lt;p&gt;Kolejno &lt;code&gt;Services&lt;/code&gt; i &lt;code&gt;Big Data Compute Edition&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;W zakładce &lt;code&gt;Instances&lt;/code&gt; mamy pomoc (linki do materiałów) oraz możliwość utworzenia klastra Big Data opartego o Apache Hadoop i rozwiązania Oracle.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-31.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tworzymy klaster za pomocą &lt;code&gt;Create Instance&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;konfiguracja-regionu&#34;&gt;Konfiguracja regionu&#xA;&lt;/h3&gt;&lt;p&gt;Mamy formularz do uzupełnienia&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-32.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Instance Name: &lt;code&gt;hadoop1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Nazwa klastra&lt;/li&gt;&#xA;&lt;li&gt;Nazwa z maksymalnie 50 znaków&lt;/li&gt;&#xA;&lt;li&gt;Tylko litery i cyfry&lt;/li&gt;&#xA;&lt;li&gt;Rozpoczynamy tylko od litery&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Description: &lt;code&gt;Apache Hadoop on OCI&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Opis / komentarz&lt;/li&gt;&#xA;&lt;li&gt;Przydatna przy dużej ilości usług&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Notification Email: &lt;code&gt;wpisujesz Swojego maila&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Na ten adres przychodzą powiadomienia zmiany statusu usługi&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Region: &lt;code&gt;eu-frankfurt-1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Miejsce tworzenia naszej instancji&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Availability Domain: &lt;code&gt;sWTS:EU-FRANKFURT-1-AD-3&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Rejon wraz z Availability Domain&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Subnet: &lt;code&gt;No Preference&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Przy takim wyborze podsieć zostanie nadana automatycznie&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tags: &lt;code&gt;test:true&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Parametr opcjonalny&lt;/li&gt;&#xA;&lt;li&gt;Pomaga w strukturze wielu usług&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-33.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Przechodzimy do kolejnego ekranu za pomocą &lt;code&gt;Next&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;konfiguracja-zasobów-klastra&#34;&gt;Konfiguracja zasobów klastra&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-35.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Deployment Profile: &lt;code&gt;Full&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Profil na jakim uruchamiamy klaster (niżej)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Full&lt;/strong&gt; dla Spark, MapReduce, Zeppelin, Hive, Spark Thrift, Big Data File System&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Basic&lt;/strong&gt; dla Spark, MapReduce, Zeppelin&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Snap&lt;/strong&gt; dla Snap, Spark, Zeppelin&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Number of Nodes: &lt;code&gt;1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ustawiamy z ilu węzłów ma się składać klaster&lt;/li&gt;&#xA;&lt;li&gt;Na potrzeby tego ćwiczenia ustawiamy jedną instancję (wszystkie usługi będą znajdować się na tej samej maszynie)&lt;/li&gt;&#xA;&lt;li&gt;Dla zrobienia HA wymagana minimalna wartość to 3&lt;/li&gt;&#xA;&lt;li&gt;Wartość maksymalna: 100&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Compute Shape: &lt;code&gt;VM.Standard2.2 - 2.0 OCPU, 30.0 GB RAM&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Wskazuje moc zastosowanych węzłów&lt;/li&gt;&#xA;&lt;li&gt;Dla dużych środowisk / zwiększenia wydajności dysku, sieci, CPU wybieramy wyższe parametry&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Queue Profile: &lt;code&gt;Preemption On&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Wskazujemy kolejki zadań dla różnych typów obciążeń&lt;/li&gt;&#xA;&lt;li&gt;Każda kolejka ma gwarantowaną minimalną wartość obciążenia&lt;/li&gt;&#xA;&lt;li&gt;3 kolejki - &lt;code&gt;Preemption On&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;2 kolejki - &lt;code&gt;Preemption Off&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Kolejki zmieniamy w panelu zarządzania&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Preemption On - opis kolejek:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;api (min: 50, max: 100)&lt;/li&gt;&#xA;&lt;li&gt;interaktywna (min: 40, max: 100)&lt;/li&gt;&#xA;&lt;li&gt;domyślna (min: 10, max: 100)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Preemption Off - opis kolejek:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;dedykowana (min: 80, max: 80)&lt;/li&gt;&#xA;&lt;li&gt;domyślna (min: 20, max: 20)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Spark Version: &lt;code&gt;2.1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Wersja platformy Apache Spark do zainstalowania&lt;/li&gt;&#xA;&lt;li&gt;ostatnie wydanie: listopad 2016 - &lt;code&gt;1.6&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;ostatnie wydanie: czerwiec 2018 - &lt;code&gt;2.1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;dostęp-do-klastra-dla-użytkownika---dla-nas&#34;&gt;Dostęp do klastra dla użytkownika - dla nas&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-36.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;SSH Public Key: &lt;code&gt;ssh-rsa xxxxxx...&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Mamy 3 możliwości dodania dostępu do węzłów&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Key File Name&lt;/code&gt; wskazujemy plik z naszym kluczem publicznym&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Key Value&lt;/code&gt; wklejamy jego zawartość&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Create a New Key&lt;/code&gt; usługodawca generuje dla nas parę kluczy i otrzymujemy klucz prywatny&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;User Name: &lt;code&gt;bdcsce_admin&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Nazwa użytkownika dla konsoli Big Data Cloud i API REST&lt;/li&gt;&#xA;&lt;li&gt;Nazwa użytkownika &lt;strong&gt;admin&lt;/strong&gt; nie jest dozwolona&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Password, Confirm Password: &lt;code&gt;nASZe7hasło_@_fuN_GNU_tuX&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Minimalnie 8 znaków&lt;/li&gt;&#xA;&lt;li&gt;Minimum jedna mała i wielka litera&lt;/li&gt;&#xA;&lt;li&gt;wymagana przynajmniej jedna cyfra&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;konfiguracja-przestrzeni-do-magazynowania-danych&#34;&gt;Konfiguracja przestrzeni do magazynowania danych&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-37.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;OCI Cloud Storage URL: &lt;code&gt;https://objectstorage.eu-frankfurt-1.oraclecloud.com/&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;OCI Cloud Storage Bucket URL: &lt;code&gt;oci://oraclebigdata@bigdatalinuxcom/&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;OCI Cloud Storage User OCID: &lt;code&gt;ocid1.user.oc1..aaaaaaaafxxx ... xxx&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;OCI Cloud Storage PEM Private Key: &lt;strong&gt;plik oci_api_key.pem&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;OCI Cloud Storage PEM Key Fingerprint: &lt;code&gt;36:76:14:2a:5b:65:02:d5:98:d4:b5:8b:df:d6:d0:e0&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;konfiguracja-wydajności-powierzchni-magazynowania&#34;&gt;Konfiguracja wydajności powierzchni magazynowania&#xA;&lt;/h3&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-38.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Use High Performance Storage: &lt;code&gt;[ ]&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Zwiększa wydajność Hadoop Distributed File System (HDFS)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Usable HDFS Storage (GB): &lt;code&gt;50&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Przestrzeń dla przechowywania danych&lt;/li&gt;&#xA;&lt;li&gt;Przy domyślnej replikacji 2 razy większa&lt;/li&gt;&#xA;&lt;li&gt;5% zarezerwowane na logi&lt;/li&gt;&#xA;&lt;li&gt;Maksymalna powierzchnia to 438 TB&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Usable BDFS Cache (GB): &lt;code&gt;50&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Maksymalnie to 74 TB&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;powiązania-między-usługami&#34;&gt;Powiązania między usługami&#xA;&lt;/h3&gt;&lt;p&gt;Łączymy usługi tak, aby mogły się ze sobą komunikować&lt;/p&gt;&#xA;&lt;h3 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h3&gt;&lt;p&gt;Po prawej stronie mamy możliwość pobrania pliku xml z wybraną konfiguracją.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-big-data-39.png&#34;&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Big Data Compute Edition w Oracle Cloud - część 1</title>
            <link>https://bigdatapassion.pl/blog/big-data-compute-edition-w-oracle-cloud-cz%C4%99%C5%9B%C4%87-1/</link>
            <pubDate>Thu, 25 Apr 2019 09:10:00 +0100</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-compute-edition-w-oracle-cloud-cz%C4%99%C5%9B%C4%87-1/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/oraclecloud/m-oracle-cloud-logo-official-website.png&#34; alt=&#34;Featured image of post Big Data Compute Edition w Oracle Cloud - część 1&#34; /&gt;&lt;p&gt;Przed uruchomieniem klastra należy utworzyć przestrzeń w której będziemy trzymać nasze dane. Do tego posłuży nam &lt;em&gt;koszyczek&lt;/em&gt; &lt;code&gt;bucket&lt;/code&gt; (nazewnictwo i funkcjonalność tej usługi podobna do AWS).&lt;/p&gt;&#xA;&lt;p&gt;Korzystamy z burger-menu (lewy górny róg strony).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-object-storage-menu-13.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy kolejno (tak jak na rysunku poniżej):&lt;/p&gt;&#xA;&lt;p&gt;Burger Menu, zakładka &lt;code&gt;Core Infrastructure&lt;/code&gt;, &lt;code&gt;Object Storage&lt;/code&gt;, w menu rozwijanym &lt;code&gt;Object Storage&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-object-storage-menu-10.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Należy wybrać gdzie będziemy tworzyć nasz koszyk. Wyboru dokonujemy w menu po lewej stronie w zakładce &lt;code&gt;List Scope&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-object-storage-compartment-11.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po wybraniu wyświetli nam się aktywny klawisz za pomocą którego utworzymy koszyk na dane. Wybieramy &lt;code&gt;Create Bucket&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-object-storage-create-bucket-12.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Pojawi się okienko z kilkoma polami do uzupełnienia. Najważniejsze z nich, które należy skonfigurować:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;nazwa koszyczka: &lt;code&gt;oraclebigdata&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;typ koszyka: &lt;code&gt;standard&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;tagi: &lt;code&gt;prod&lt;/code&gt; &lt;code&gt;false&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Typ koszyka definiuje nam z jakiego typu powierzchni do przechowywania danych możemy skorzystać. Główną różnicą jest wydajność. Ogólnie dokonany wybór wpływa również na koszt.&lt;/p&gt;&#xA;&lt;p&gt;Tagi są bardzo pomocne przy katalogowaniu zasobów, ich rozliczeniu, zwiększają czytelność i możliwość zarządzania.&lt;/p&gt;&#xA;&lt;p&gt;Po uzupełnieniu pól należy zatwierdzić za pomocą &lt;code&gt;Create Burger&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-object-storage-create-bucket-14.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na liście pojawi nam się nowo utworzony koszyczek. Wybierając go (klikając na jego nazwę lub z bocznego menu: &lt;code&gt;. . .&lt;/code&gt; &lt;code&gt;View Bucket&lt;/code&gt;) mamy dostępne jego szczegóły. Dla nas najważniejszy jest adres przydziału. Wyświetlamy go wybierając &lt;code&gt;Show&lt;/code&gt; z wiersza z opisem &lt;code&gt;Compartment&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-object-storage-create-bucket-15.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ten adres należy sobie zapisać, gdyż będzie nam potrzebny przy uruchamianiu klastra.&lt;/p&gt;&#xA;&lt;p&gt;Mamy już adres składowania danych, potrzebujemy jeszcze użytkownika, który będzie zarządzał klastrem. Dla naszego przykładu posłużymy się naszą tożsamością. Wybieramy ikonkę profilu w prawym górnym rogu naszego web-interfejsu. Oznaczono zielonym kółeczkiem.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-identity-users-20.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Z menu wybieramy opcję &lt;code&gt;oracleidentitycloudservice/marcin@gnulinux.pl&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-identity-users-21.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Podobnie jak przy adresie wiaderka i ten adres musimy sobie zachować.&lt;/p&gt;&#xA;&lt;p&gt;Dla umożliwienia zestawienia połączenia ze środowiskiem (dostęp użytkownik do zarządzania wiaderkiem poprzez API) należy dodać nasz klucz publiczny.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-identity-users-22.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Najlepiej wygenerować parę kluczy na Swoim komputerze. Jak to zrobić? Na swoim komputerze tworzymy katalog &lt;code&gt;.oci&lt;/code&gt; w katalogu domowym.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir ~/.oci&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Wyniki niektórych poleceń mogą się nieznacznie różnić od Twoich&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;Generujemy nasz klucz prywatny:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl genrsa -out ~/.oci/oci_api_key.pem 2048&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;W terminalu otrzymamy:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Generating RSA private key, 2048 bit long modulus (2 primes)&#xA;.........................................................+++++&#xA;................................................................+++++&#xA;e is 65537 (0x010001)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Ważne jest, aby utworzyć klucz bez hasła&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;Zmieniamy uprawnienia (tylko do odczytu)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;chmod go-rwx ~/.oci/oci_api_key.pem&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Odczytujemy fingerprint naszego kucza prywatnego:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl rsa -pubout -outform DER -in ~/.oci/oci_api_key.pem | openssl md5 -c&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Poglądowy wynik polecenia:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;writing RSA key&#xA;(stdin)= 59:67:f7:c1:26:18:9f:f2:a6:f9:56:dd:66:85:b8:96&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tworzymy klucz publiczny:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wynik polecenia:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;writing RSA key&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sprawdzamy czy wszystko jest np. poleceniem &lt;code&gt;ls&lt;/code&gt; lub &lt;code&gt;tree&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tree ~/.oci&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Oczekiwany wynik:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/home/marcin/.oci&#xA;├── oci_api_key.pem&#xA;└── oci_api_key_public.pem&#xA;&#xA;0 directories, 2 files&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sprawdzamy zawartość naszego klucza publicznego:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cat ~/.oci/oci_api_key_public.pem&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Oczekiwany wynik:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-----BEGIN PUBLIC KEY-----&#xA;MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw+j1FaTJCwhUeAQI6koh&#xA;4z6vzU6qUunqAIs+qdwENvbbP+sj6PlDmfvWF9INzEeDX36fElHeQVndRmIOVbh4&#xA;iq0nIHvUnhKFWs7nYp/8jzg0sa15B+Z2j23slcB2zRmsDdgeYkkVEkGutW1tvhy1&#xA;B+EEgtuPngzigL9ZNYoT/oI5yxeFR0GtJOqHRXdp4JazaOTPAdLwtLoDoOmImCvX&#xA;hmPBu8fx2bq0DK57Wr10mXOYFcMmzyp2jvZD+ppAcIhbaceQfcXX0nIU4Db4Y027&#xA;kNXhSvFguwtcEomYEh0r73o78J5KmaTdKI1uU25CMAqqoqHe6w3M/5ZUEmkdyAvr&#xA;XQIDAQAB&#xA;-----END PUBLIC KEY-----&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Kopiujemy powyższy wynik polecenia &lt;code&gt;cat&lt;/code&gt; do naszego interfejsu. Wybieramy &lt;code&gt;Add Public Key&lt;/code&gt; i w pole &lt;code&gt;Public Key&lt;/code&gt; wklejamy całość.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-identity-users-23.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Zatwierdzamy klawiszem &lt;code&gt;Add&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Oczekiwany wynik przedstawia poniższy rysunek. Fingerprint klucza powinien być identyczny z wynikiem naszego polecenia, u mnie to &lt;code&gt;59:67:f7:c1:26:18:9f:f2:a6:f9:56:dd:66:85:b8:96&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-oc-identity-users-24.png&#34;&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Rozpoczęcie pracy w chmurze Oracle Cloud</title>
            <link>https://bigdatapassion.pl/blog/rozpocz%C4%99cie-pracy-w-chmurze-oracle-cloud/</link>
            <pubDate>Wed, 24 Apr 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/rozpocz%C4%99cie-pracy-w-chmurze-oracle-cloud/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/oraclecloud/m-oracle-cloud-logo-official-website.png&#34; alt=&#34;Featured image of post Rozpoczęcie pracy w chmurze Oracle Cloud&#34; /&gt;&lt;h1 id=&#34;tworzymy-konto&#34;&gt;Tworzymy konto&#xA;&lt;/h1&gt;&lt;p&gt;Przechodzimy na stronę &lt;a class=&#34;link&#34; href=&#34;https://myservices.us.oraclecloud.com/mycloud/signup&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://myservices.us.oraclecloud.com/mycloud/signup&lt;/a&gt; i korzystamy z promocji &lt;strong&gt;Get zł1150 of free credits good for up to 3500 hours of Oracle Cloud usage for the next 30 days&lt;/strong&gt;. Rejestracja jest łatwa. Podajemy nasz adres e-mail i nasz kraj.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-registration-marcin-gnulinux-pl-account-data-01.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na kolejnej stronie wybieramy typ naszego konta: do użytku prywatnego &lt;code&gt;Account Type: Personal Use&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym polu wskazujemy nazwę naszego projektu, użyj innej nazwy niż na obrazku.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-registration-marcin-gnulinux-pl-account-details-02.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybór regionu jest zawężony do dwóch, w których działa bezpłatna usługa &lt;code&gt;Free Oracle Cloud Promotion&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Ameryka Północna &lt;code&gt;North America&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Obszar Europy, Bliskiego Wschodu i Afryki &lt;code&gt;EMEA&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Dobrym wyborem jest &lt;code&gt;EMEA&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po uzupełnieniu wymaganych danych (oznaczonych gwiazdką) oczekujemy SMSa z kodem weryfikacyjnym (numer składający się z 7 cyfr). Wiadomość przychodzi po ok. 20 sekundach, mamy 2 minuty na przepisanie numeru - gdy czas upłynie, możemy ponowić przesłanie numeru wybierając &lt;code&gt;Resend Code&lt;/code&gt;. W moim przypadku nadawcą wiadomości był &lt;code&gt;22 884&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-registration-marcin-gnulinux-pl-verify-code-03.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Kolejnym krokiem jest dodanie karty płatniczej.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-registration-marcin-gnulinux-pl-add-credit-card-04.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po przepisaniu i akceptacji danych (trwa to 10 sekund) zostajemy przeniesieni na &lt;a class=&#34;link&#34; href=&#34;https://cloud.oracle.com/getting-started&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cloud.oracle.com/getting-started&lt;/a&gt; i już możemy się zalogować.&lt;/p&gt;&#xA;&lt;h1 id=&#34;logowanie&#34;&gt;Logowanie&#xA;&lt;/h1&gt;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-login-marcin-gnulinux-pl-05.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na stronie &lt;code&gt;https://cloud.oracle.com/home&lt;/code&gt; podajemy trzy dane do logowania:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;nazwa projektu&lt;/li&gt;&#xA;&lt;li&gt;login&lt;/li&gt;&#xA;&lt;li&gt;hasło&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tymczasowe hasło otrzymamy mailem (oczekiwałem mniej niż minutę).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-registration-marcin-gnulinux-pl-mail-07.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Nazwa projektu to ten sam wpis, który utworzyliśmy podczas rejestrowania się w Oracle Cloud.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-login-marcin-gnulinux-pl-06.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na kolejnym ekranie podajemy nasz e-mail i hasło tymczasowe.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-login-marcin-gnulinux-pl-08.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ustalamy nasze nowe hasło.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-login-marcin-gnulinux-pl-new-password-09.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Należy zwrócić uwagę na wymagania:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;minimum 12 znaków&lt;/li&gt;&#xA;&lt;li&gt;lecz nie więcej niż 40&lt;/li&gt;&#xA;&lt;li&gt;nie może zawierać imienia&lt;/li&gt;&#xA;&lt;li&gt;nie może zawierać nazwiska&lt;/li&gt;&#xA;&lt;li&gt;nie może zawierać nazwy użytkownika&lt;/li&gt;&#xA;&lt;li&gt;musi posiadać przynajmniej jeden mały znak&lt;/li&gt;&#xA;&lt;li&gt;musi posiadać przynajmniej jedną dużą literę&lt;/li&gt;&#xA;&lt;li&gt;musi posiadać przynajmniej jedną cyfrę&lt;/li&gt;&#xA;&lt;li&gt;nie mogą powtarzać się 4 znaki&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Po poprawnym zatwierdzeniu hasła zostaniemy przekierowani na panel &lt;code&gt;Dashboard&lt;/code&gt;. Po prawej stronie WebUI powinniśmy zobaczyć nasz billing.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-login-marcin-gnulinux-pl-billing-00.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Pozostaje tylko ustawić nasze preferencje dot.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;wybór języka interfejsu&lt;/li&gt;&#xA;&lt;li&gt;wybór kraju&lt;/li&gt;&#xA;&lt;li&gt;wybór strefy czasowej&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/oraclecloud/m1904-marcin-gnulinux-pl-preferences-time-zone-lang-11.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Zakładanie konta zakończone :)&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Instalacja dystrybucji Hortonworks Data Platform 3.1 za pomocą Apache Ambari</title>
            <link>https://bigdatapassion.pl/blog/instalacja-dystrybucji-hortonworks-data-platform-3.1-za-pomoc%C4%85-apache-ambari/</link>
            <pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/instalacja-dystrybucji-hortonworks-data-platform-3.1-za-pomoc%C4%85-apache-ambari/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/hortonworks-logo.png&#34; alt=&#34;Featured image of post Instalacja dystrybucji Hortonworks Data Platform 3.1 za pomocą Apache Ambari&#34; /&gt;&lt;p&gt;Instrukcja instalacji dystrybucji Hortonworks Data Platform HDP 3.1 na maszynach z systemem Red Hat 7 lub CentOS 7.&lt;/p&gt;&#xA;&lt;p&gt;Do instalacji zostanie użyte:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HDP-3.1.0.0&lt;/li&gt;&#xA;&lt;li&gt;Apache Ambari w wersji 2.7.3.0&lt;/li&gt;&#xA;&lt;li&gt;CentOS 7 lub Red Hat 7&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Instalacja może być przeprowadzona tylko na jednej maszynie oraz w klastrze. W przypadku jednej maszyny należy w każdym miejscu konfiguracji wskazać jeden i ten sam host. Wszystko usługi, zarówno typu master jak i slave, będą zainstalowane na tym jednym komputerze.&lt;/p&gt;&#xA;&lt;p&gt;W przypadku systemów produkcyjnych jedyną zalecaną opcją jest instalacja w klastrze kilku maszyn. Jedną maszynę możemy wykorzystywać do celów testowych i developerskich.&lt;/p&gt;&#xA;&lt;h1 id=&#34;przygotowanie-maszyn&#34;&gt;Przygotowanie maszyn&#xA;&lt;/h1&gt;&lt;p&gt;Taką instalację możemy przeprowadzić w dowolnym środowisku, np. z użyciem &lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/devops/virtualbox-installing-cluster-with-centos&#34; &gt;VirtualBoxa&lt;/a&gt; lub chmury &lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/cloud/aws/aws-installing-cluster-with-centos&#34; &gt;AWS&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;klaster-ssh&#34;&gt;Klaster ssh&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli chcemy wykonywać wybrane polecenia jednocześnie na wszystkich maszynach możemy użyć polecenia &lt;em&gt;cssh&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cssh root@hdp1 root@hdp2 root@hdp3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli wolimy klasyczne ssh, logujemy się na każdą maszynę oddzielnie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@hdp1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UWAGA: Wszystkie dalsze polecenia wykonujemy zalogowani jako użytkownik &lt;em&gt;root&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;dostęp-do-internetu&#34;&gt;Dostęp do internetu&#xA;&lt;/h2&gt;&lt;p&gt;Żeby instalować dodatkowe pakiety musimy mieć dostęp do internetu. Jeśli nie jest on dostępny, można spróbować włączyć DHCP.&lt;/p&gt;&#xA;&lt;p&gt;Aby włączyć ręcznie DHCP należy wykonać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhclient -v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W celu skonfigurowania tego na stałe warto zmienić wartość (ONBOOT=yes) w pliku /etc/sysconfig/network-scripts/ifcfg-eth0&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y vim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/sysconfig/network-scripts/ifcfg-enp0s3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;włączamy-logowanie-roota-po-haśle&#34;&gt;Włączamy logowanie root&amp;rsquo;a po haśle&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli chcemy umożliwić logowanie użytkownika &lt;em&gt;root&lt;/em&gt; po haśle ustawiamy parametr (PermitRootLogin yes) w pliku /etc/ssh/sshd_config&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/ssh/sshd_config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(&lt;strong&gt;UWAGA nigdy tego nie róbmy na produkcyjnych serwerach, NIGDY!&lt;/strong&gt;)&lt;/p&gt;&#xA;&lt;h2 id=&#34;logowanie-po-ssh&#34;&gt;Logowanie po SSH&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli korzystamy z systemów Linux/Mac wygodnym rozwiązaniem może okazać się konfiguracja dostępu z swojego komputer i swojej konsoli. Żeby nie musieć podawać przy logowaniu ciągle hasła, warto wrzucić na maszynę wirtualną swój klucz publiczny by logować się bez hasła.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-copy-id root@localhost -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@localhost -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Możliwość logowania do wszystkich maszyn możemy sprawdzić za pomocą polecenia:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i in &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;1..5..1&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; ssh hdp&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;i&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt; uptime; &lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;aktualizacja-systemu&#34;&gt;Aktualizacja systemu&#xA;&lt;/h2&gt;&lt;p&gt;Żeby pracować na najnowszej wersji systemu należy go zaktualizować&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y upgrade&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalacja-epel-release&#34;&gt;Instalacja epel release&#xA;&lt;/h2&gt;&lt;p&gt;CentOS:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y epel-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Red Hat:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /tmp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y wget&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y epel-release-latest-7.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum repolist&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalacja-kolejnych-przydatnych-narzędzi&#34;&gt;Instalacja kolejnych przydatnych narzędzi&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install wget vim htop ntp openssh-server openssh-clients nano bash-completion tree mc byobu ncdu&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;zmieniamy-hostname-opcjonalnie&#34;&gt;Zmieniamy hostname (opcjonalnie)&#xA;&lt;/h2&gt;&lt;p&gt;Uwaga, ustawiamy nowe wpisy hostname tylko i wyłącznie wtedy gdy chcemy je zmienić na własne. W wielu przypadkach możemy zostawić obecne hosty o ile są jakieś dostępne.&lt;/p&gt;&#xA;&lt;p&gt;Na każdej z maszyn ustawiamy inny hostname, na przykład:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname hdpx.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hortonworks Data Platform Node&amp;#34;&lt;/span&gt; --pretty&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname hdpx.bigdatapassion.com --static&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname hdpx.bigdatapassion.com --transient&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;gdzie x to numer danego węzła, czyli hdp1, hdp2 i tak dalej.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli mamy jedną maszynę możemy ustawić:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname sandbox.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Status możemy sprawdzić&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname -f&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Polecenie hostname i hostname -f powinny zwracać tą samą wartość.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;konfiguracja-hostów&#34;&gt;Konfiguracja hostów&#xA;&lt;/h2&gt;&lt;p&gt;Poniższe ustawienie jest nam niezbędne jeśli ustawiliśmy własne wpisy hostname (punkt wyżej) oraz nie mamy żadnego systemu DNS który mógłby informować nasze maszyny jaki hostname odpowiada jakiemu adresowi ip.&lt;/p&gt;&#xA;&lt;p&gt;Żeby maszyny się &amp;ldquo;widziały&amp;rdquo; musimy każdej ustawić odpowiedni hostname:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.201 hdp1.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.202 hdp2.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.203 hdp3.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dla maszyn które mają zarówno adresy prywatne jak i publiczne (np. AWS lub Oracle Cloud) powinniśmy ustawić te prywatne. Oczywiście lista zależy od liczby maszyn (w tym przypadku 3) oraz adresach ip które można sprawdzić za pomocą polecenia &amp;ldquo;ip a&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Dla jednego serwera możemy użyć localhost/127.0.0.1:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;127.0.0.1   sandbox sandbox.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;::1         localhost localhost.localdomain localhost6 localhost6.localdomain6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;konfigurujemy-logowanie-ssh-bez-hasła&#34;&gt;Konfigurujemy logowanie SSH bez hasła&#xA;&lt;/h2&gt;&lt;p&gt;Hadoop do działania wymaga by użytkownik systemowy mógł logować się do innych maszyn bez hasła za pomocą infrastruktury klucza prywatnego i publicznego, dlatego wykonujemy poniższe polecenia.&lt;/p&gt;&#xA;&lt;p&gt;Na każdej maszynie generujemy zestaw kluczy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen -f .ssh/id_rsa -t rsa -N &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Na maszynie hdp1 wyświetlamy sobie klucz publiczny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat .ssh/id_rsa.pub&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pobrany klucz maszyny &lt;em&gt;hdp1&lt;/em&gt; wklejamy na każdej maszynie (także &lt;em&gt;hdp1&lt;/em&gt;) do pliku:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim .ssh/authorized_keys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli wszystko poszło jak trzeba z maszyny &lt;em&gt;hdp1&lt;/em&gt; możemy teraz zalogować się po SSH do każdej innej maszyny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh hdp3.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli instalujemy to na jednej maszynie wystarczy wykonać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen -f .ssh/id_rsa -t rsa -N &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-copy-id sandbox.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh sandbox.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wyłączamy-selinux&#34;&gt;Wyłączamy selinux&#xA;&lt;/h2&gt;&lt;p&gt;Edytujemy plik /etc/sysconfig/selinux ustawiając SELINUX na disabled.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39;&lt;/span&gt; /etc/sysconfig/selinux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39;&lt;/span&gt; /etc/selinux/config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setenforce &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sestatus&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wyłączamy-firewalla&#34;&gt;Wyłączamy Firewall&amp;rsquo;a&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable firewalld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl stop firewalld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status firewalld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable firewalld.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl stop firewalld.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status firewalld.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;włączamy-serwer-czasu-ntp&#34;&gt;Włączamy serwer czasu NTP&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y ntp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable chrony.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable ntpd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start ntpd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status ntpd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable ntpd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl is-enabled ntpd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start ntpd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status ntpd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;umask&#34;&gt;Umask&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;umask &lt;span style=&#34;color:#ae81ff&#34;&gt;022&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo umask &lt;span style=&#34;color:#ae81ff&#34;&gt;022&lt;/span&gt; &amp;gt;&amp;gt; ~/.bash_profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo umask &lt;span style=&#34;color:#ae81ff&#34;&gt;022&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;restart-maszyn&#34;&gt;Restart maszyn&#xA;&lt;/h2&gt;&lt;p&gt;Teraz warto wykonać restart wszystkich maszyn poleceniem &lt;em&gt;reboot&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-apache-ambari&#34;&gt;Instalacja Apache Ambari&#xA;&lt;/h1&gt;&lt;p&gt;UWAGA: Od teraz wszystkie operacje wykonujemy tylko na maszynie &lt;em&gt;hdp1&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -nv http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.7.3.0/ambari.repo -O /etc/yum.repos.d/ambari.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum repolist&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalujemy-ambari&#34;&gt;Instalujemy Ambari&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install ambari-server -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;konfigurujemy-ambari&#34;&gt;Konfigurujemy Ambari&#xA;&lt;/h2&gt;&lt;p&gt;(W każdym pytaniu wybieramy odpowiedź domyślną klikając klawisz &lt;em&gt;Enter&lt;/em&gt; za każdrym razem)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server setup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W przypadku ambari-server setup upewniamy się, że nie ma żadnych ostrzeżeń, zaś na wszystkie pytania odpowiadamy wartościami domyślnymi klikając enter:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;root@hdp1 ~&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ambari-server setup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Using python  /usr/bin/python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Setup ambari-server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking SELinux...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SELinux status is &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;enabled&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SELinux mode is &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;permissive&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WARNING: SELinux is set to &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;permissive&amp;#39;&lt;/span&gt; mode and temporarily disabled.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;OK to &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Customize user account &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ambari-server daemon &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Adjusting ambari-server permissions and ownership...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking firewall status...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking JDK...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Oracle JDK 1.8 + Java Cryptography Extension &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;JCE&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Policy Files &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Custom JDK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;==============================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter choice &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To download the Oracle JDK and the Java Cryptography Extension &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;JCE&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Policy Files you must accept the license terms found at http://www.oracle.com/technetwork/java/javase/terms/license/index.html and not accepting will cancel the Ambari Server setup and you must install the JDK and JCE files manually.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Do you accept the Oracle Binary Code License Agreement &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downloading JDK from http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-8u112-linux-x64.tar.gz to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jdk-8u112-linux-x64.tar.gz... 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;174.7 MB of 174.7 MB&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully downloaded JDK distribution to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing JDK to /usr/jdk64/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully installed JDK to /usr/jdk64/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downloading JCE Policy archive from http://public-repo-1.hortonworks.com/ARTIFACTS/jce_policy-8.zip to /var/lib/ambari-server/resources/jce_policy-8.zip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully downloaded JCE Policy archive to /var/lib/ambari-server/resources/jce_policy-8.zip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing JCE policy...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Check JDK version &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; Ambari Server...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;JDK version found: &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Minimum JDK version is &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; Ambari. Skipping to setup different JDK &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; Ambari Server.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking GPL software agreement...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GPL License &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; LZO: https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enable Ambari Server to download and install GPL Licensed LZO packages &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Completing setup...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter advanced database configuration &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Default properties detected. Using built-in database.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring ambari database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking PostgreSQL...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Running initdb: This may take up to a minute.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Initializing database ... OK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;About to start PostgreSQL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring local database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring PostgreSQL...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Restarting PostgreSQL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating schema and user...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating tables...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Extracting system views...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-admin-2.7.3.0.139.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;....&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ambari repo file contains latest json url http://public-repo-1.hortonworks.com/HDP/hdp_urlinfo.json, updating stacks repoinfos with it...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Adjusting ambari-server permissions and ownership...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ambari Server &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;setup&amp;#39;&lt;/span&gt; completed successfully.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;uruchamiamy-ambari&#34;&gt;Uruchamiamy Ambari&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;instalacja-sterownika-jdbc&#34;&gt;Instalacja sterownika JDBC&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli w naszym klastrze chcielibyśmy użyć narzędzia Apache Hive lub innego który używa biblioteki jdbc, konieczne będzie ściągnięcie i zarejestrowanie odpowiedniego sterownika jdbc za pomocą poniższego polecenia:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget http://central.maven.org/maven2/mysql/mysql-connector-java/8.0.12/mysql-connector-java-8.0.12.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv mysql-connector-java-8.0.12.jar /opt/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ll /opt/ | grep mysql&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server setup --jdbc-db&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;mysql --jdbc-driver&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/opt/mysql-connector-java-8.0.12.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Powyższy przykład dotyczy bazy MySQL, dla innej oczywiście potrzebny jest analogiczny sterownik.&lt;/p&gt;&#xA;&lt;h1 id=&#34;konfiguracja-klastra-hdp-za-pomocą-ambari-ui&#34;&gt;Konfiguracja klastra HDP za pomocą Ambari UI&#xA;&lt;/h1&gt;&lt;p&gt;Następnie wchodzimy na adres: http://hdp1:8080 (lub inny wybrany hostname) i całą instalację kontynuujemy w trybie graficznym. Logujemy się jako admin / admin.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-ambari-login.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Następnie klikamy przycisk &lt;em&gt;Launch Install Wizard&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-lanuch-install.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ustawiamy nazwę naszego klastra&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-cluster-name.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy wersję dystrybucji którą chcemy zainstalować&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-select-version.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym ekranie w polu &lt;em&gt;Target Hosts&lt;/em&gt; wskazujemy pełne adresy wybranych maszyn na których chcemy postawić dystrybucję&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp1.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp2.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp3.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub dla jednej maszyny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sandbox.bigdatapassion.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz wklejamy zawartość pliku /root/.ssh/id_rsa maszyny na której zainstalowaliśmy Ambari&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-install-options.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po kliknięciu &lt;em&gt;Register and Confirm&lt;/em&gt; Ambari przygotowuje nasze maszyny do instalacji&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-confirm-hosts.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zakończonym procesie powinniśmy dostać informację o udanym przygotowaniu maszyn&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-confirm-hosts-success.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jeśli jednak mamy informację o ostrzeżeniach na końcu instalacji agentów lub błędach podczas instalacji, należy przejrzeć ich listę i rozwiązać problemy&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-confirm-hosts-error.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Następnie wybieramy narzędzia które chcemy zainstalować (ilość i rodzaj według uznania, np. HDFS, MapReduce2, Tez, Hive, Pig, HBase, Oozie, Flume, Ambari Metrics)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-choose-services.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Niektóre narzędzia są połączone na tyle silnie, że Ambari może nam zasugerować konieczność instalacji czegoś dodatkowo&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-choose-services-needed.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ambari będzie także proponować nam instalację narzędzi które twórcy uznali za ważne a my ich samodzielnie nie wybraliśmy&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-choose-services-warning.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wskazujemy na których maszynach mają być zainstalowane usługi zarządzające (Masters) (można zostawić na początek proponowane rozmieszczenie, tematowi jak rozmieszczać usługi przyjrzymy się w innym wpisie)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-assign-masters.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;oraz usługi robocze (Slaves) (dla naszego testowego środowiska wybieramy wszystkie maszyny dla każdej z usług)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-assign-slaves.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Konfigurujemy nasze serwisy, pola wymagane są na czerwono (najczęściej konieczność ustawienia hasła do bazy danych), pozostałe ustawienia na ten moment możemy pozostawić w ich wartościach domyślnych&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-configure1.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-configure2.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-configure3.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-configure4.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-configure5.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Akceptujemy ostrzeżenia i dostajemy podsumowanie instalacji&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-review.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na koniec Ambari zaczyna instalować wszystkie usługi zgodnie z naszymi wytycznymi&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-install1.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-install2.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-install3.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zakończonej instalacji możemy korzystać już w pełni wdrożonego klastra.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-ambari-summary.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp3-ambari-install/hdp-ambari-after-install.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;możliwe-problemy&#34;&gt;Możliwe problemy&#xA;&lt;/h1&gt;&lt;p&gt;Gdyby w trakcie instalacji wystąpiły jakieś błędy podczas uruchamiania usług, możemy spróbować zatrzymać wszystkie serwisy a następnie ponownie je włączyć. W tym celu w lewym pasku serwisów w menu &lt;em&gt;Actions&lt;/em&gt; wybieramy &lt;em&gt;Stop All&lt;/em&gt; a następnie &lt;em&gt;Start All&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;W przypadku niektórych wersji systemu CentOS lub Red Hat konieczna może okazać się ta &lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/devops/ambari-and-libtirpc-devel/&#34; &gt;porada&lt;/a&gt; związana z brakiem biblioteki &lt;strong&gt;libtirpc-devel&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://hortonworks.com/products/data-center/hdp/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://hortonworks.com/products/data-center/hdp/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://ambari.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://ambari.apache.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/download_the_ambari_repo_lnx7.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/download_the_ambari_repo_lnx7.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/ambari_repositories.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/ambari_repositories.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://cwiki.apache.org/confluence/display/AMBARI/Installation&amp;#43;Guide&amp;#43;for&amp;#43;Ambari&amp;#43;2.5.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cwiki.apache.org/confluence/display/AMBARI/Installation+Guide+for+Ambari+2.5.0&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari/Ambari-2.6.2.2/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari/Ambari-2.6.2.2/index.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-installation/content/hdp_26_repositories.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-installation/content/hdp_26_repositories.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/rebuilding_oozie_war.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/rebuilding_oozie_war.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/rebuilding_oozie_war.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/rebuilding_oozie_war.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>AI &amp; NLP WORKSHOP DAY 2018</title>
            <link>https://bigdatapassion.pl/blog/ai-nlp-workshop-day-2018/</link>
            <pubDate>Tue, 09 Oct 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/ai-nlp-workshop-day-2018/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/nlpday-2018.png&#34; alt=&#34;Featured image of post AI &amp; NLP WORKSHOP DAY 2018&#34; /&gt;&lt;p&gt;19 października 2018 roku będę prowadził dwa warsztaty w ramach wydarzenia &lt;a class=&#34;link&#34; href=&#34;https://nlpday.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AI &amp;amp; NLP Workshop Day&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Obydwa warsztaty będą dotyczyć bardzo popularnych obecnie tematów w Big Data i AI jakimi są przetwarzanie strumieniowe w czasie rzeczywistym oraz wykorzystaniu chmur publicznych.&lt;/p&gt;&#xA;&lt;p&gt;Dla osób chcących wziąć udział w tym wydarzeniu przekazuje kod zniżkowy (15%) &lt;strong&gt;dbUFYw&lt;/strong&gt; :)&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Building Realtime &amp; Big Data Pipelines with Apache Kafka</title>
            <link>https://bigdatapassion.pl/blog/building-realtime-big-data-pipelines-with-apache-kafka/</link>
            <pubDate>Mon, 08 Oct 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/building-realtime-big-data-pipelines-with-apache-kafka/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/confitura-2018.jpg&#34; alt=&#34;Featured image of post Building Realtime &amp; Big Data Pipelines with Apache Kafka&#34; /&gt;&lt;p&gt;Na kanale &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/channel/UCkVjQGf_e0JmlonPMS4VNXQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;YouTube&lt;/a&gt; Confitury pojawiły się nagrania z tegorocznej konferencji.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej relacja:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/7p68xPhKzsQ&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;oraz moja prezentacja:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/p3ScERQu9HY&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Podcast na temat Big Data</title>
            <link>https://bigdatapassion.pl/blog/podcast-na-temat-big-data/</link>
            <pubDate>Fri, 20 Jul 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/podcast-na-temat-big-data/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/news/stacja_it.jpg&#34; alt=&#34;Featured image of post Podcast na temat Big Data&#34; /&gt;&lt;p&gt;Na stronie &lt;strong&gt;Stacji IT&lt;/strong&gt; pojawił się nowy podcast w ramach którego miałem przyjemność opowiedzieć o Big Data.&lt;/p&gt;&#xA;&lt;p&gt;Można go odsłuchać na stronie: &lt;a class=&#34;link&#34; href=&#34;https://stacja.it/podcast/2018-07-20-radek-szmit-o-big-data.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://stacja.it/podcast/2018-07-20-radek-szmit-o-big-data.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Polecam także inne podcasty, można się dowiedzieć więcej o Big Data, Data Science, programowaniu i wielu innych ciekawych tematach.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Konferencje o tematyce Big Data</title>
            <link>https://bigdatapassion.pl/blog/konferencje-o-tematyce-big-data/</link>
            <pubDate>Thu, 19 Jul 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/konferencje-o-tematyce-big-data/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/&#34; alt=&#34;Featured image of post Konferencje o tematyce Big Data&#34; /&gt;&lt;p&gt;Poniżej na bieżąco zbierana i aktualizowana lista najciekawszych konferencji o tematyce Big Data w Polsce i za granicą.&lt;/p&gt;&#xA;&lt;p&gt;Lista alfabetyczna!&lt;/p&gt;&#xA;&lt;h1 id=&#34;polskie-konferencje&#34;&gt;Polskie konferencje&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://nlpday.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AI &amp;amp; NLP Workshop Day&lt;/a&gt; - October 19th, 2018, Warsaw, Poland&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://adformhls.splashthat.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ADFORM HIGH LOAD STRATEGY CONFERENCE 2018&lt;/a&gt; - 4 October, Copernicus Science Center, Wybrzeże Kościuszkowskie 20, Warsaw, Poland&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatatechwarsaw.eu/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Big Data Tech Warsaw&lt;/a&gt; - Warsaw, Poland, on February 2019&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://2018.confitura.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Confitura&lt;/a&gt; - 30 June 2018&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://conf.dataworkshop.eu/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Data Workshop Club Conf&lt;/a&gt; - 13 października, Warszawa&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://devoxx.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Devoxx&lt;/a&gt; - Krakow, Poland, 24-27 June 2019&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://mlforum.pl/agenda/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Machine Learning@Enterprise&lt;/a&gt; - 18 września 2018&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://plinml.mimuw.edu.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Polish View on Machine Learning&lt;/a&gt; - Warsaw, 14 - 17.12.2018&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://pydata.org/warsaw2018/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;PyData Warsaw&lt;/a&gt; - 19-20 November 2018&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://scalar-conf.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Scalar&lt;/a&gt; - 6-7.04.2018&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://whyr.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;WhyR&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;zagraczniczne-konferencje&#34;&gt;Zagraczniczne konferencje&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://datasciconference.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Data Science Conference / 4.0&lt;/a&gt; - 18 i 19 września w Belgradzie&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://dataworkssummit.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;DATAWORKS SUMMITS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://databricks.com/sparkaisummit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;SPARK + AI SUMMIT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Apache Kafka w kontenerze Docker</title>
            <link>https://bigdatapassion.pl/blog/apache-kafka-w-kontenerze-docker/</link>
            <pubDate>Fri, 22 Jun 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/apache-kafka-w-kontenerze-docker/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kafka/feather-3237961_1280.jpg&#34; alt=&#34;Featured image of post Apache Kafka w kontenerze Docker&#34; /&gt;&lt;p&gt;Apache Kafka można z łatwością uruchomić na swoim komputerze korzystając z gotowych obrazów Dockera. Poniżej kilka przykładów jak to zrobić.&lt;/p&gt;&#xA;&lt;p&gt;Użyjemy obrazów:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://hub.docker.com/r/wurstmeister/zookeeper/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;wurstmeister/zookeeper&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://hub.docker.com/r/wurstmeister/kafka/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;wurstmeister/kafka&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;jeden-broker-i-zookeeper&#34;&gt;Jeden broker i ZooKeeper&#xA;&lt;/h1&gt;&lt;p&gt;Przygotowanie sieci:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network rm bdp_kafka_network&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network create --driver bridge bdp_kafka_network&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network ls&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kontener ZooKeepera:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --name zookeeper.bigdatapassion.pl &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -p 2181:2181 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --network&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;bdp_kafka_network &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --hostname&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;zookeeper.bigdatapassion.pl &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -d &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    wurstmeister/zookeeper:latest&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kontener Kafki:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run --name kafka.bigdatapassion.pl &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -p 9092:9092 &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --env KAFKA_ZOOKEEPER_CONNECT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;zookeeper.bigdatapassion.pl &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --network&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;bdp_kafka_network &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    --hostname&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;kafka.bigdatapassion.pl &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    -d &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    wurstmeister/kafka:1.0.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dodajemy w pliku /etc/hosts:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;127.0.0.1   zookeeper.bigdatapassion.pl kafka.bigdatapassion.pl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Żeby zatrzymać i wyczyścić:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker stop zookeeper.bigdatapassion.pl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker stop kafka.bigdatapassion.pl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rm zookeeper.bigdatapassion.pl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rm kafka.bigdatapassion.pl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker ps -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;trzech-brokerów-i-zookeeper&#34;&gt;Trzech brokerów i ZooKeeper&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli chcemy uruchomić lokalnie Apache Kafka na więcej niż jednym brokerze za pomocą Dockera może użyć do tego Docker Compose&lt;/p&gt;&#xA;&lt;p&gt;Kafka 1.0.0&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;3.5&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;zookeeper&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_zookeeper&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wurstmeister/zookeeper&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2181:2181&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafkanetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;kafka1&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wurstmeister/kafka:1.0.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9092:9092&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;hostname&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafkanetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_zookeeper:2181&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;zookeeper&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;kafka2&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wurstmeister/kafka:1.0.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9093:9092&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;hostname&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafkanetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_zookeeper:2181&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafka1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;kafka3&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wurstmeister/kafka:1.0.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9094:9092&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;hostname&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafkanetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_zookeeper:2181&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafka2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;kafkanetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;driver&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;bridge&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kafka 1.1.0&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;3.5&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;zookeeper&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_zookeeper&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wurstmeister/zookeeper&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2181:2181&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafkanetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;kafka1&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wurstmeister/kafka:1.1.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9092:9092&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;hostname&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafkanetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_LISTENERS&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;PLAINTEXT://:9092&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_zookeeper:2181&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;zookeeper&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;kafka2&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wurstmeister/kafka:1.1.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9093:9092&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;hostname&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafkanetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_LISTENERS&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;PLAINTEXT://:9092&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_zookeeper:2181&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafka1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;kafka3&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;wurstmeister/kafka:1.1.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;9094:9092&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;hostname&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_kafka3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafkanetwork&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_LISTENERS&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;PLAINTEXT://:9092&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cluster_zookeeper:2181&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        - &lt;span style=&#34;color:#ae81ff&#34;&gt;kafka2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;kafkanetwork&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;driver&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;bridge&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Instalacja Apache Kafka</title>
            <link>https://bigdatapassion.pl/blog/instalacja-apache-kafka/</link>
            <pubDate>Wed, 20 Jun 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/instalacja-apache-kafka/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kafka/feather-3237961_1280.jpg&#34; alt=&#34;Featured image of post Instalacja Apache Kafka&#34; /&gt;&lt;p&gt;W dzisiejszym poście jak zainstalować sobie szybko kafkę lokalnie do testów. Będziemy używać dystrybucji Apache.&lt;/p&gt;&#xA;&lt;p&gt;Instalacja dla systemu Linux.&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-wersji-z-jednym-brokerem&#34;&gt;Instalacja wersji z jednym brokerem&#xA;&lt;/h1&gt;&lt;p&gt;Zaczynamy od ściągnięcia Kafki i rozpakowania w nowym katalogu. Najnowsza wersja jest do ściągnięcia ze &lt;a class=&#34;link&#34; href=&#34;https://kafka.apache.org/downloads&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;strony projektu&lt;/a&gt;. Będziemy używać wersji Kafki 1.1.0 dla języka Scala w wersji 2.11 (aktualnie 2.11 jest zalecana zarówno dla Kafki jak i Sparka stąd dość oczywisty wybór).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir kafka&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd kafka&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget http://ftp.man.poznan.pl/apache/kafka/1.1.0/kafka_2.11-1.1.0.tgz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -xzf kafka_2.11-1.1.0.tgz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;uruchomienie-jednego-brokera&#34;&gt;Uruchomienie jednego brokera&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli chcemy pracować w wersji z jednym brokerem to już koniec. Teraz wystarczy uruchomić &lt;em&gt;Zookeepera&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd kafka_2.11-1.1.0/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/zookeeper-server-start.sh config/zookeeper.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz brokera&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-server-start.sh config/server.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oczywiście robimy to w oddzielnych terminalach lub w tle jako demony (pokazane niżej).&lt;/p&gt;&#xA;&lt;h1 id=&#34;operacje-na-apache-kafka&#34;&gt;Operacje na Apache Kafka&#xA;&lt;/h1&gt;&lt;p&gt;Zaczynamy od stworzenia topicu&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; --partitions &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; --topic test&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;teraz możemy sprawdzić listę topiców&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --list --zookeeper localhost:2181&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Uruchamiamy skrypt producenta&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz skrypt konsumenta&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;i wysyłamy kilka wiadomości z poziomu producenta sprawdzając czy zostały odebrane przez konsumenta. Jeśli zobaczymy nasze wiadomości, Kafka działa poprawnie.&lt;/p&gt;&#xA;&lt;h1 id=&#34;kilku-brokerów&#34;&gt;Kilku brokerów&#xA;&lt;/h1&gt;&lt;p&gt;By poczuć się jak w środowisku rozproszonym, powołamy do życia dwóch kolejnych brokerów na tym samym komputerze&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp config/server.properties config/server1.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp config/server.properties config/server2.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim config/server1.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim config/server2.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edytując dwa ostatnie pliki zmieniamy&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;broker.id=0&#xA;listeners=PLAINTEXT://:9092&#xA;log.dirs=/tmp/kafka-logs&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;na&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;broker.id=1&#xA;listeners=PLAINTEXT://:9093&#xA;log.dirs=/tmp/kafka-logs1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;oraz&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;broker.id=2&#xA;listeners=PLAINTEXT://:9094&#xA;log.dirs=/tmp/kafka-logs2&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(uwaga opcja listeners może być zakomentowana, trzeba usunąć znak # przed nazwą)&lt;/p&gt;&#xA;&lt;p&gt;Następnie uruchamiamy dwóch dodatkowych brokerów w oddzielnych oknach terminala (poprzedni jest ciągle włączony)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-server-start.sh config/server1.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-server-start.sh config/server2.properties&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tworzymy zreplikowany topic&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; --partitions &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; --topic my-replicated-topic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz topic z partycjami&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; --partitions &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; --topic my-partitioned-topic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz topic zreplikowany z partycjami&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; --partitions &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; --topic my-super-topic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wyświetlamy listę topiców&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --list --zookeeper localhost:2181&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wyświetlamy informacje o topicach za pomocą describe&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-partitioned-topic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-super-topic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Docker - najbardziej przydatne polecenia</title>
            <link>https://bigdatapassion.pl/blog/docker-najbardziej-przydatne-polecenia/</link>
            <pubDate>Mon, 18 Jun 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/docker-najbardziej-przydatne-polecenia/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/&#34; alt=&#34;Featured image of post Docker - najbardziej przydatne polecenia&#34; /&gt;&lt;p&gt;Docker jest obecnie jednym z najpopularniejszych systemów konteneryzacji. O kontenerze możemy myśleć jak o czymś pomiędzy maszyną wirtualną która jest w pełni odizolowanym środowiskiem a aplikacjami instalowanymi w jednym wspólnym serwerze. Poniżej lista najbardziej przydatnych poleceń Docker&amp;rsquo;a.&lt;/p&gt;&#xA;&lt;h1 id=&#34;info&#34;&gt;Info&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker info&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker --version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;obrazy&#34;&gt;Obrazy&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker images&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rmi centos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rmi &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;docker images -q&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rmi -f &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;docker images -q&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;kontenery&#34;&gt;Kontenery&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker ps&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker ps -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;usunięcie-kontenerów&#34;&gt;Usunięcie kontenerów&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rm &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;docker ps -aq&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker rm -f &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;docker ps -aq&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;podgląd&#34;&gt;Podgląd&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker inspect centos&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;uruchomienie&#34;&gt;Uruchomienie&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;--name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;NAZWA&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; OBRAZ &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;POLECENIE&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run centos echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świeci&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;logi&#34;&gt;Logi&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker logs &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;nazwa&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;bash&#34;&gt;Bash&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker exec -it NAZWA_URUCHOMIONEGO_KONTENERA bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;networking&#34;&gt;Networking&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker network rm &lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;docker network ls -q&lt;span style=&#34;color:#e6db74&#34;&gt;`&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;kopiowanie-plików&#34;&gt;Kopiowanie plików&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker cp kataloglokalny/plik.txt container:/tmp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;docker-compose&#34;&gt;Docker Compose&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose up&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker-compose down&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Big Data i sztuczna inteligencja na konferencji Confitura 2018</title>
            <link>https://bigdatapassion.pl/blog/big-data-i-sztuczna-inteligencja-na-konferencji-confitura-2018/</link>
            <pubDate>Tue, 05 Jun 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/big-data-i-sztuczna-inteligencja-na-konferencji-confitura-2018/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/events/confitura-2018.jpg&#34; alt=&#34;Featured image of post Big Data i sztuczna inteligencja na konferencji Confitura 2018&#34; /&gt;&lt;p&gt;W tym roku, jedna z największych i moim zdaniem zarazem najlepszych polskich konferencji, czyli &lt;a class=&#34;link&#34; href=&#34;https://2018.confitura.pl/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Confitura&lt;/strong&gt;&lt;/a&gt;, po raz pierwszy będzie miała specjalną oddzielną ścieżkę &lt;strong&gt;Big Data and Artificial Intelligence&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Confitura&lt;/strong&gt; jest konferencją poświęconą środowisku Java, stąd jest znana przede wszystkim programistom wykorzystującym do swej pracy &lt;em&gt;Maszynę Wirtualną Java&lt;/em&gt;, czyli np. programistom takich języków jak Java, Scala, Kotlin czy Groovy. Wcześniej konferencja znana była pod nazwą &lt;strong&gt;Javarsowia&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ścieżka &lt;strong&gt;Big Data and Artificial Intelligence&lt;/strong&gt; pojawia się na niej po raz pierwszy, jednak z racji dużej popularności platformy Java w Big Data i Data Science, pojawiały się tam już wcześniej tematy o podobnej tematyce. Chyba nie muszę przypominać, że takie narzędzia jak choćby Hadoop, Hive, Spark, Kafka czy Zeppelin, są stworzone właśnie w języku Java i/lub Scala.&lt;/p&gt;&#xA;&lt;p&gt;Także po raz pierwszy w tym roku, konferencji będą towarzyszyć &lt;a class=&#34;link&#34; href=&#34;https://2018.confitura.pl/workshops&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;warsztaty&lt;/strong&gt;&lt;/a&gt; następnego dnia po konferencji.&lt;/p&gt;&#xA;&lt;p&gt;Tych co nigdy nie byli na &lt;em&gt;Confiturze&lt;/em&gt;, gorąco zachęcam do udziału. Konferencja jest &lt;strong&gt;darmowa&lt;/strong&gt;, jednak z powodu ogromnej liczby chętnych, wprowadzono licytacje drobnych cegiełek charytatywnych w zamian za możliwość otrzymania biletu wstępu.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli chcielibyście zobaczyć jak było na poprzednich edycjach, polecam kanał konferencji na &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/user/confiturapl&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;YouTube&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Zapraszam także przy okazji na moją prezentację oraz warsztaty dotyczące jednej z obecnie najpopularniejszych technologii Big Data, czyli &lt;strong&gt;Apache Kafka&lt;/strong&gt;.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #7: Programowanie funkcyjne - rozwiązanie</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%237-programowanie-funkcyjne-rozwi%C4%85zanie/</link>
            <pubDate>Fri, 01 Jun 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%237-programowanie-funkcyjne-rozwi%C4%85zanie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-7.jpg&#34; alt=&#34;Featured image of post Wyzwanie Java #7: Programowanie funkcyjne - rozwiązanie&#34; /&gt;&lt;p&gt;Czas na rozwiązanie ostatniego wyzwania z programowania w języku Java. Tym razem chcieliśmy byście użyli funkcjonalności dostępnych od JDK w wersji 8 to przetworzenia zbioru filmów z portalu &lt;a class=&#34;link&#34; href=&#34;https://grouplens.org/datasets/movielens/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;MovieLens&lt;/a&gt; (zbiór MovieLens 20M Dataset, plik movies.csv).&lt;/p&gt;&#xA;&lt;p&gt;Programowanie funkcyjne dla wielu początkujących osób bywa bardzo trudne oraz wymaga praktyki, dlatego pozostawiliśmy tą część języka Java na sam koniec. Gdybyście chcieli rozszerzyć wiedzę z tego zakresu, oprócz dokumentacji i materiałów dostępnych w internecie, na rynku można znaleźć wiele książek dotyczących programowania funkcyjnego w Javie 8, jak choćby &lt;strong&gt;Functional Programming in Java&lt;/strong&gt; której autorem jest Venkat Subramaniam, bardzo popularny &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=15X0qFtBqiQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;prezenter&lt;/a&gt; na konferencjach programistycznych w Polsce i na świecie lub &lt;strong&gt;Java 8. Przewodnik doświadczonego programisty&lt;/strong&gt; Cay S. Horstmanna, autora wielu cenionych książek do nauki języka Java.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej możliwe rozwiązanie naszego ostatniego wyzwania:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Files;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Path;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Paths;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.IntSummaryStatistics;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Map;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.function.Function;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.stream.Collectors;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import static&lt;/span&gt; java.text.MessageFormat.format;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Challenge7&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path sourcePath &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/ml-20m/movies.csv&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; lines;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;readAllLines&lt;/span&gt;(sourcePath);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (Exception e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Błąd dostępu do pliku: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; sourcePath.&lt;span style=&#34;color:#a6e22e&#34;&gt;getFileName&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Parsowanie pliku CSV&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;[]&amp;gt;&lt;/span&gt; movies &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;skip&lt;/span&gt;(1) &lt;span style=&#34;color:#75715e&#34;&gt;// pomijamy nagłówek&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(Challenge7::parseCSV)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#a6e22e&#34;&gt;toList&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Łączną ilość filmów w pliku (celowo użycie strumieni a nie lines.count)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; movies.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(format(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Łączna ilość filmów w pliku: {0}&amp;#34;&lt;/span&gt;, count));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Przedział lat w jakim te filmy wyszły (daty są w nawiasie w tytule)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        IntSummaryStatistics statistics &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; movies.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(movie &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; movie&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;trim&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;// rok filmu jest zawsze na końcu&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(title &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; title.&lt;span style=&#34;color:#a6e22e&#34;&gt;substring&lt;/span&gt;(title.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; 5, title.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; 1))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(Challenge7::isNumeric)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;mapToInt&lt;/span&gt;(Integer::parseInt)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;summaryStatistics&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(format(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Filmy zostały wyprodukowane w latach {0} - {1}&amp;#34;&lt;/span&gt;, statistics.&lt;span style=&#34;color:#a6e22e&#34;&gt;getMin&lt;/span&gt;(), statistics.&lt;span style=&#34;color:#a6e22e&#34;&gt;getMax&lt;/span&gt;()));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Ile filmów znajduje się w każdym gatunku filmowym&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Map&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String, Long&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; genresCollect &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; movies.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(movie &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; movie&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;// Znak | jest wyrażeniem specjalnym, musimy użyć \\ by potraktować go jak zwykły znak&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;flatMap&lt;/span&gt;(genres &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;(genres.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\\|&amp;#34;&lt;/span&gt;)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#a6e22e&#34;&gt;groupingBy&lt;/span&gt;(Function.&lt;span style=&#34;color:#a6e22e&#34;&gt;identity&lt;/span&gt;(), Collectors.&lt;span style=&#34;color:#a6e22e&#34;&gt;counting&lt;/span&gt;()));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        genresCollect.&lt;span style=&#34;color:#a6e22e&#34;&gt;entrySet&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;sorted&lt;/span&gt;(Map.&lt;span style=&#34;color:#a6e22e&#34;&gt;Entry&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;comparingByKey&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(entry &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Gatunek: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; entry.&lt;span style=&#34;color:#a6e22e&#34;&gt;getKey&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; ilość filmów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; entry.&lt;span style=&#34;color:#a6e22e&#34;&gt;getValue&lt;/span&gt;()));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Najczęstszy gatunek filmowy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        genresCollect.&lt;span style=&#34;color:#a6e22e&#34;&gt;entrySet&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;max&lt;/span&gt;(Map.&lt;span style=&#34;color:#a6e22e&#34;&gt;Entry&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;comparingByValue&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;ifPresent&lt;/span&gt;(element &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(format(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Naczęstrszy gatunek filmowy to: {0}, liczba filmów: {1}&amp;#34;&lt;/span&gt;, element.&lt;span style=&#34;color:#a6e22e&#34;&gt;getKey&lt;/span&gt;(), element.&lt;span style=&#34;color:#a6e22e&#34;&gt;getValue&lt;/span&gt;())));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Do parsowania pliku można użyć np. własnego kodu, wyrażeń regularnych lub pliku&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * W tej metodzie zostały użyte wyrażenia regularne&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parseCSV&lt;/span&gt;(String line) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String regex &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;,(?=([^\&amp;#34;]*\&amp;#34;[^\&amp;#34;]*\&amp;#34;)*[^\&amp;#34;]*$)&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; movie &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(regex);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String title &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; movie&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;trim&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (title.&lt;span style=&#34;color:#a6e22e&#34;&gt;charAt&lt;/span&gt;(0) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; title.&lt;span style=&#34;color:#a6e22e&#34;&gt;charAt&lt;/span&gt;(title.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; 1) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            movie&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; title.&lt;span style=&#34;color:#a6e22e&#34;&gt;substring&lt;/span&gt;(1, title.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; 1).&lt;span style=&#34;color:#a6e22e&#34;&gt;trim&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; movie;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Sprawdzam czy String zawiera w sobie liczbę (jeden z filmów w zbiorze nie ma roku podanego)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;isNumeric&lt;/span&gt;(String str) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; c : str.&lt;span style=&#34;color:#a6e22e&#34;&gt;toCharArray&lt;/span&gt;()) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;Character.&lt;span style=&#34;color:#a6e22e&#34;&gt;isDigit&lt;/span&gt;(c)) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Wyzwanie Java #7: Programowanie funkcyjne</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%237-programowanie-funkcyjne/</link>
            <pubDate>Sun, 27 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%237-programowanie-funkcyjne/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-7.jpg&#34; alt=&#34;Featured image of post Wyzwanie Java #7: Programowanie funkcyjne&#34; /&gt;&lt;p&gt;Do tej pory cały czas mówiliśmy, że Java jest językiem obiektowym. Poświęciliśmy temu zagadnieniu dwa dedykowane wyzwania, choć tak naprawdę już od pierwszego programu, gdyż użyliśmy słowa kluczowego &lt;strong&gt;class&lt;/strong&gt; programowaliśmy obiektowo w Javie. Tak naprawdę tylko typy proste, ze względu na pewne optymalizacje, nie są obiektami, czyli jak już wiemy z poprzednich wyzwań, nie dziedziczą po &lt;strong&gt;java.lang.Object&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jednak programowanie obiektowe, nie jest jedynym &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Paradygmat_programowania&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;paradygmatem programowania&lt;/a&gt; jaki może wykorzystywać język programowania. Aktualnie coraz szersze zastosowania znajduje &lt;strong&gt;programowanie funkcyjne&lt;/strong&gt;. Ma ono swoje podstawy już w latach trzydziestych XX wieku gdy to Alonzo Church opracował &lt;strong&gt;rachunek lambda&lt;/strong&gt;. Dla przypomnienia, język Simula wprowadzający programowanie obiektowe został opracowany dopiero w latach sześćdziesiątych XX wieku. Pierwszym językiem funkcyjnym był &lt;strong&gt;IPL (Information Processing Language)&lt;/strong&gt;, jednak popularyzacja tego paradygmatu zaczęła się wraz z pojawieniem się języka &lt;strong&gt;LISP&lt;/strong&gt;. Jednym z najpopularniejszych funkcyjnych języków programowania jest &lt;strong&gt;Haskell&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;W programowaniu funkcyjnym, w odróżnieniu od programowania obiektowego, najważniejszym i zarazem jedynym narzędziem są funkcje. Funkcje mogą przyjmować na wejściu także funkcje oraz zwracać funkcje jako wynik. W przeciwieństwie do podejścia &amp;ldquo;klasycznego&amp;rdquo; gdzie opisywaliśmy zawsze jak coś zrobić krok po kroku, tutaj musimy napisać co ma być zrobione a już kompilator zajmie się całą resztą. Programista nie steruje także kolejnością wykonywania działań, definiuje jedynie szereg matematycznych zależności i funkcji. Pozbywamy się także wielu problemów znanych z świata obiektowego, czyli stan obiektu i jego synchronizacja w aplikacjach wielowątkowych, w programowaniu funkcyjnym nie ma czegoś takiego, przez co pisanie wielowątkowych i rozproszonych systemów staje się prostsze. W językach funkcyjnych także kod potrafi być od kilku do kilkudziesięciu razy zwięźlejszy i czytelniejszy niż analogiczny algorytm napisany w języku obiektowym. Dzięki tym zaletom, programowanie funkcyjne aktualnie rozkwita i jest coraz częściej stosowane. Niestety nie bez powodu czekaliśmy na ten moment tyle lat, takie podejście ma także swoje wady. Bardzo często programy stworzone w językach funkcyjnych są po prostu wolne. Nie da się także każdego problemu informatycznego tak łatwo przedstawić w postaci zbioru zależnych od siebie funkcji matematycznych bez uciekania się do tego wszystkiego co znamy z języków obiektowych. Dlatego też coraz więcej powstaje języków &lt;strong&gt;hybrydowych&lt;/strong&gt; które pozwalają pisać swój kod zarówno w sposób obiektowy jak i funkcyjny.&lt;/p&gt;&#xA;&lt;p&gt;Java od wersji 8 także zyskała wiele mechanizmów znanych z paradygmatu programowania funkcyjnego. Niektórzy twierdzą, że jest to najbardziej rewolucyjna i znacząca aktualizacja JVM. Mimo to, Java w dalszym ciągu jest językiem obiektowym. W tym poście będziemy chcieli poznać podstawy programowania funkcyjnego w Javie i nowości które weszły wraz z wersją ósmą.&lt;/p&gt;&#xA;&lt;h1 id=&#34;wyrażenia-lambda&#34;&gt;Wyrażenia lambda&#xA;&lt;/h1&gt;&lt;p&gt;Przed chwilą dowiedzieliśmy się, że z językami funkcyjnymi związane są &lt;strong&gt;lambdy&lt;/strong&gt;. Pomijając matematyczne wywody, lambda to tak naprawdę kawałek kodu który można przekazać do innego kawałka programu w celu wykonania. Czyli parametrem nie jest obiekt czy wartość, tylko nasz kod.&lt;/p&gt;&#xA;&lt;p&gt;Wyobraźmy sobie że mamy kolekcję obiektów i chcemy tą kolekcję posortować. Zrobilibyśmy pewnie tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Collections;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LambdaExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words); &lt;span style=&#34;color:#75715e&#34;&gt;// sortowanie kolekcji według naturalnego porządku&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(words);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Powyższy kod korzysta z klasy &lt;strong&gt;Collections&lt;/strong&gt; i wbudowanej tam metody &lt;strong&gt;sort&lt;/strong&gt; która wykonała nam co trzeba. Ale co jeśli chcielibyśmy posortować w odwrotnej kolejności lub z zachowaniem własnych innych reguł? Do tego służy tak zwany &lt;strong&gt;komparator&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Collections;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Comparator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LambdaExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; WordComparator()); &lt;span style=&#34;color:#75715e&#34;&gt;// sortowanie kolekcji odwrócone&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(words);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WordComparator&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; Comparator&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;compare&lt;/span&gt;(String o1, String o2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; o2.&lt;span style=&#34;color:#a6e22e&#34;&gt;compareTo&lt;/span&gt;(o1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym kodzie musieliśmy stworzyć dodatkową klasę która definiuje warunek sortowania. Moglibyśmy także tą klasę zdefiniować we wnętrzu klasy &lt;em&gt;LambdaExample&lt;/em&gt;, tworząc tak zwaną &lt;strong&gt;klasę wewnętrzną&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Collections;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Comparator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LambdaExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WordComparator&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; Comparator&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;compare&lt;/span&gt;(String o1, String o2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; o2.&lt;span style=&#34;color:#a6e22e&#34;&gt;compareTo&lt;/span&gt;(o1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; WordComparator()); &lt;span style=&#34;color:#75715e&#34;&gt;// sortowanie kolekcji odwrócone&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(words);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gdybyśmy chcieli uprościć nasz kod możemy napisać coś takiego:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Collections;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Comparator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LambdaExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Comparator&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;compare&lt;/span&gt;(String o1, String o2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; o2.&lt;span style=&#34;color:#a6e22e&#34;&gt;compareTo&lt;/span&gt;(o1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }); &lt;span style=&#34;color:#75715e&#34;&gt;// sortowanie kolekcji odwrócone&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(words);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wykorzystaliśmy do tego tak zwaną &lt;strong&gt;klasę anonimową&lt;/strong&gt;, czyli taką która nie ma nazwy (wcześniej WordComparator), mimo że robi dokładnie to samo co wcześniej. Często tworzenie takich klas &amp;ldquo;w locie&amp;rdquo; jest po prostu łatwiejsze i szybsze, niż definiowanie nowych klas i wymyślanie im nazw. Jedyny problem jest taki, że z takiej klasy nie skorzystamy już gdzieś indziej, tylko w tym miejscu naszego kodu.&lt;/p&gt;&#xA;&lt;p&gt;Dzięki &lt;strong&gt;wyrażeniom lambda&lt;/strong&gt; nasz kod może się uprościć jeszcze bardziej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Collections;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Comparator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LambdaExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words, (String o1, String o2) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; {&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; o2.&lt;span style=&#34;color:#a6e22e&#34;&gt;compareTo&lt;/span&gt;(o1);}); &lt;span style=&#34;color:#75715e&#34;&gt;// lambda&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(words);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Składnia lambdy jest dość prosta:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(parametry...) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; {kod}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli nie ma parametrów, wystarczy podać pusty nawias. Jeśli parametry mają typ którego kompilator potrafi się domyślić, można je pominąć:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words, (o1, o2) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; {&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; o2.&lt;span style=&#34;color:#a6e22e&#34;&gt;compareTo&lt;/span&gt;(o1);});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli kod jest tylko pojedynczym wyrażeniem, można pominąć klamry i słowo &amp;ldquo;return&amp;rdquo; otrzymując:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words, (o1, o2) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; o2.&lt;span style=&#34;color:#a6e22e&#34;&gt;compareTo&lt;/span&gt;(o1));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lambdy można tworzyć tam gdzie parametrem jest interfejs z jedną metodą abstrakcyjną, w pozostałych przypadkach trzeba zaimplementować go standardowo. Takie interfejsy nazywamy &lt;strong&gt;funkcyjnymi&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;referencje-do-metod&#34;&gt;Referencje do metod&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli metoda której chcemy użyć w naszym komparatorze już istnieje, możemy jej także użyć w naszym wyrażeniu lambda. Możemy ją po prostu wywołać tak jak wcześniej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Collections;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LambdaExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words, (o1, o2) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; o1.&lt;span style=&#34;color:#a6e22e&#34;&gt;compareTo&lt;/span&gt;(o2)); &lt;span style=&#34;color:#75715e&#34;&gt;// sortowanie kolekcji według naturalnego porządku&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(words);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ale możemy też przekazać samą funkcję &lt;em&gt;compareTo&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Collections;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;LambdaExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Collections.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;(words, String::compareTo); &lt;span style=&#34;color:#75715e&#34;&gt;// sortowanie kolekcji według naturalnego porządku&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(words);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Powyższe dwa kawałki kodu są identyczne w działaniu, zaś drugi jest dużo prostszy do napisania. Na uwagę zasługuje znak &amp;ldquo;::&amp;rdquo; wskazujący, że przekazujemy funkcję do wykonania.&lt;/p&gt;&#xA;&lt;h1 id=&#34;biblioteka-strumieni&#34;&gt;Biblioteka strumieni&#xA;&lt;/h1&gt;&lt;p&gt;Ostatnią dużą nowością która weszła wraz z Javą w wersji 8 jest biblioteka strumieni. Umożliwiają one operacje na kolekcjach w zupełnie inny sposób, z wykorzystaniem tak zwanej wewnętrznej iteracji. Strumienie to tak naprawdę ciąg elementów, jeden po drugim, na których możemy wykonywać różne operacje.&lt;/p&gt;&#xA;&lt;p&gt;Wyobraźmy sobie, że mając ten sam zbiór słów co wyżej, chcemy je wszystkie wyświetlić. Znając pętle z języka Java, moglibyśmy napisać taki kod:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;StreamExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (String word : words) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(word);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dzięki strumieniom powyższą pętlę &lt;strong&gt;foreach&lt;/strong&gt; można zamienić na &lt;strong&gt;stream&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;words.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;((String s) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; {System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(s);});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub łatwiej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;words.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(s &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(s));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;czy nawet:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;words.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;::println);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cały program wtedy będzie wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;StreamExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        words.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;::println);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gdybyśmy chcieli teraz dla przykładu zostawić tylko słowa dłuższe lub równe 3 literom możemy napisać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;StreamExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        words.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(s &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; s.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; 3)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;::println);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Możemy też z łatwością zliczyć ile było elementów jednocześnie je wyświetlając:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;StreamExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; words.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(s &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; s.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; 3)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;peek&lt;/span&gt;(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;::println)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Elementów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; count);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Należy tylko zauważyć, że zmieniliśmy funkcję &lt;strong&gt;forEach&lt;/strong&gt; na &lt;strong&gt;peek&lt;/strong&gt; gdyż ta pierwsza wymaga zakończenia operacji na strumieniu, ta druga zaś pozwala dalej wykonywać operacje jak choćby nasz &amp;ldquo;count&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Dzięki strumieniom możemy także łatwo przekształcać nasze zbiory w inne:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.stream.Collectors;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;StreamExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; newWords &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; words.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(String::toUpperCase)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;(Collectors.&lt;span style=&#34;color:#a6e22e&#34;&gt;toList&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        newWords.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(s &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; s.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; 3)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;::println);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym przykładzie kolekcja słów została zamieniona w kolekcję, że każde słowo jest pisane dużymi literami. Pobranie wyniku przetwarzania dzieje się w metodzie &lt;strong&gt;collect&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Powyższy program można by było uprościć także do takiej postaci:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.func;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Arrays;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;StreamExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Arrays.&lt;span style=&#34;color:#a6e22e&#34;&gt;asList&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;czarnego&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;o&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imieniu&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Bonifacy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        words.&lt;span style=&#34;color:#a6e22e&#34;&gt;stream&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(String::toUpperCase)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(s &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; s.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; 3)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                .&lt;span style=&#34;color:#a6e22e&#34;&gt;forEach&lt;/span&gt;(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;::println);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak widać, biblioteka strumieni w Javie jest zarazem bardzo prosta i przejrzysta a jednocześnie oferuje niezwykle bogaty wachlarz funkcjonalności. Napisanie powyższych fragmentów kodu z użyciem pętli zamiast strumieni, kod byłby bardziej zawiły i wymagał chwili zastanowienia co tam się dzieje.&lt;/p&gt;&#xA;&lt;h1 id=&#34;wyzwanie&#34;&gt;Wyzwanie&#xA;&lt;/h1&gt;&lt;p&gt;Czas na nasze wyzwanie. Chcielibyśmy, by za pomocą poznanej wiedzy, czyli &lt;em&gt;strumieni&lt;/em&gt;, &lt;em&gt;wyrażeń lambda&lt;/em&gt; oraz &lt;em&gt;referencji do metod&lt;/em&gt; napisali program który wczyta zawartość pliku z filmami ze zbioru &lt;a class=&#34;link&#34; href=&#34;https://grouplens.org/datasets/movielens/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;MovieLens&lt;/a&gt; (zbiór MovieLens 20M Dataset, plik movies.csv) i wyliczy następujące rzeczy:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Łączną ilość filmów w pliku&lt;/li&gt;&#xA;&lt;li&gt;Przedział lat w jakim te filmy wyszły (daty są w nawiasie w tytule)&lt;/li&gt;&#xA;&lt;li&gt;Najczęstszy gatunek filmowy&lt;/li&gt;&#xA;&lt;li&gt;Ile filmów znajduje się w każdym gatunku filmowym&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Wynik ma być wyświetlony w konsoli.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Książki które powinien przeczytać każdy programista Java</title>
            <link>https://bigdatapassion.pl/blog/ksi%C4%85%C5%BCki-kt%C3%B3re-powinien-przeczyta%C4%87-ka%C5%BCdy-programista-java/</link>
            <pubDate>Thu, 24 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/ksi%C4%85%C5%BCki-kt%C3%B3re-powinien-przeczyta%C4%87-ka%C5%BCdy-programista-java/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/java/book-3356154_1280.jpg&#34; alt=&#34;Featured image of post Książki które powinien przeczytać każdy programista Java&#34; /&gt;&lt;p&gt;W dzisiejszym poście chciałbym przedstawić kilka książek które według mnie każdy kto chce zawodowo programować w Javie powinien przeczytać. Nie będą to oczywiście książki do nauki samego języka, tylko wiedza dużo szersza, choć wcale nie musisz być niezwykle doświadczonym programistą by zacząć je czytać, wręcz przeciwnie, niejeden młodszy programista może znacząco poprawić wynik swojej rozmowy kwalifikacyjnej po tej lekturze.&lt;/p&gt;&#xA;&lt;p&gt;Część z tych książek została wydana w polskim tłumaczeniu, jednak podam nazwy oryginalnych wydań.&lt;/p&gt;&#xA;&lt;h1 id=&#34;effective-java-3-joshua-bloch&#34;&gt;Effective Java 3 (Joshua Bloch)&#xA;&lt;/h1&gt;&lt;figure class=&#34;book-cover-mini&#34;&gt;&lt;img src=&#34;https://bigdatapassion.pl/img/post/java/java-best-book-to-read/effective-java.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Zaczynamy od najbardziej kultowej książki dla programistów, czyli &lt;strong&gt;Efective Java&lt;/strong&gt; napisanej przez Joshua Blocha który przez długi czas pracując w Sun Microsystems rozwijał język i platformę Java. Obecnie pracuje w firmie Google. Jest jednym z największych ekspertów od języka Java uznanym na całym świecie.&lt;/p&gt;&#xA;&lt;p&gt;Książka pokazuje jak wykorzystać język i platformę Java do granic jej możliwości pisząc dobry i wydajny kod. Pozwala także unikać wielu błędów popełnianych przez mniej doświadczonych programistów.&lt;/p&gt;&#xA;&lt;h1 id=&#34;clean-code-robert-c-martin&#34;&gt;Clean Code (Robert C. Martin)&#xA;&lt;/h1&gt;&lt;figure class=&#34;book-cover-mini&#34;&gt;&lt;img src=&#34;https://bigdatapassion.pl/img/post/java/java-best-book-to-read/clean-code.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Kolejna książka z serii &amp;ldquo;tych które trzeba przeczytać&amp;rdquo;. Tym razem &lt;strong&gt;Clean Code&lt;/strong&gt; (tytuł polskiej edycji: Czysty kod) Roberta Martina który w świecie Java jest znany jako &lt;strong&gt;Wujek Bob&lt;/strong&gt; (ang. Uncle Bob). Jeśli kiedykolwiek usłyszycie tą nazwę, chodzi właśnie o tego człowieka. Wujek Bob jest autorem wielu znamienitych pozycji, to jest jedna z jego najbardziej znanych książek. Jego książki są pisane łatwym i przystępnym językiem, dlatego czyta je się bardzo szybko i przyjemnie.&lt;/p&gt;&#xA;&lt;p&gt;Książka nie dotyczy tak naprawdę języka Java, jest przeznaczona dla wszystkich programistów, choć zamieszczone tam przykłady kodu są w języku Java, stąd ogromna popularność jego książek właśnie w tej grupie. Wujek Bob pokazuje w niej jak pisać dobry kod, czyli taki który łatwo utrzymać, łatwo testować, łatwo czytać, po prostu nie trzeba się za niego wstydzić.&lt;/p&gt;&#xA;&lt;h1 id=&#34;clean-coder-robert-c-martin&#34;&gt;Clean Coder (Robert C. Martin)&#xA;&lt;/h1&gt;&lt;figure class=&#34;book-cover-mini&#34;&gt;&lt;img src=&#34;https://bigdatapassion.pl/img/post/java/java-best-book-to-read/clean-coder.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Skoro już jesteśmy przy Wujku Bobie, to kolejną jego wartą pozycją do przeczytania jest &lt;strong&gt;Clean Coder&lt;/strong&gt; (tytuł polskiej edycji: Mistrz czystego kodu). W tej książce autor opisuje nie kod, tylko nas samych, czyli opowiada o tym co robić by stać się profesjonalistą na rynku pracy. Jest także dużo o testowaniu kodu, pracy w projekcie i współpracy z innymi programistami.&lt;/p&gt;&#xA;&lt;h1 id=&#34;clean-architecture-robert-c-martin&#34;&gt;Clean Architecture (Robert C. Martin)&#xA;&lt;/h1&gt;&lt;figure class=&#34;book-cover-mini&#34;&gt;&lt;img src=&#34;https://bigdatapassion.pl/img/post/java/java-best-book-to-read/clean-architecture.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Ostatnia na naszej liście pozycja Wujka Boba to &lt;strong&gt;Clean Architecture&lt;/strong&gt; (tytuł polskiej edycji: Czysta architektura). W tej książce autor opisuje uniwersalne reguły dotyczące architektury naszych aplikacji, czyli jak je projektować, jak separować kod, jak zapewnić porządek w projekcie i wiele wiele innych. Pozycja trochę trudniejsza od poprzednich, bo i temat bardziej zaawansowany, dlatego warto po nią chwycić po przeczytaniu dwóch wcześniejszych książek Wujka Boba.&lt;/p&gt;&#xA;&lt;h1 id=&#34;wzorce-projektowe-erich-gamma-richard-helm-ralph-johnson-john-vlissides&#34;&gt;Wzorce projektowe (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)&#xA;&lt;/h1&gt;&lt;figure class=&#34;book-cover-mini&#34;&gt;&lt;img src=&#34;https://bigdatapassion.pl/img/post/java/java-best-book-to-read/design-patterns.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Kolejna klasyka na liście książek. Dotyczy ona &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Wzorzec_projektowy_%28informatyka%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;wzorców projektowych&lt;/a&gt; czyli dobrych praktyk i rozwiązań które możemy, a wręcz nawet powinniśmy, stosować w swoich aplikacjach. Wzorce projektowe są swoistego rodzaju niezbędnikiem na większości rozmowach kwalifikacyjnych i kursach programowania. Książka ta ma czterech autorów, który potocznie nazywani są &lt;strong&gt;Gangiem czterech&lt;/strong&gt; (ang. Gang of Four, GoF). Dlatego potocznie wiele osób używa skrótu &lt;strong&gt;GOF&lt;/strong&gt; właśnie do określania wzorców projektowych.&lt;/p&gt;&#xA;&lt;p&gt;Powyższa książka należy do tych najbardziej znanych i rozpoznawalnych, ale istnieje wiele innych dobrych pozycji dotyczących wzorców projektowych, dlatego polecam po prostu wybranie dowolnej z nich.&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-pragmatic-programmer-david-thomas-andrew-hunt&#34;&gt;The Pragmatic Programmer (David Thomas, Andrew Hunt)&#xA;&lt;/h1&gt;&lt;figure class=&#34;book-cover-mini&#34;&gt;&lt;img src=&#34;https://bigdatapassion.pl/img/post/java/java-best-book-to-read/pragmatic-programmer.jpg&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;The Pragmatic Programmer&lt;/strong&gt; (tytuł polskiej edycji: Pragmatyczny programista) to kolejna bardzo dobrze oceniania i polecana książka dla wszystkich programistów. Autorzy pokazują szereg technik, podejść i rozwiązań pozwalających na zwiększenie efektywności naszej pracy.&lt;/p&gt;&#xA;&lt;h1 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h1&gt;&lt;p&gt;Na tym zakończę listę. Tak naprawdę, można by było jeszcze bardzo długo wymieniać szereg znanych i cenionych książek, więc jeśli już przeglądaliście jakieś pozycje dotyczące programowania, mogliście pomyśleć sobie &amp;ldquo;przecież nie ma książki &amp;hellip;&amp;rdquo;, jednak moim celem było wyselekcjonowanie tych naprawdę najbardziej podstawowych pozycji po które powinno się sięgnąć zaczynając swoją przygodę z programowaniem.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #6: Operacje wejścia - wyjścia - rozwiązanie</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%236-operacje-wej%C5%9Bcia-wyj%C5%9Bcia-rozwi%C4%85zanie/</link>
            <pubDate>Wed, 23 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%236-operacje-wej%C5%9Bcia-wyj%C5%9Bcia-rozwi%C4%85zanie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/doors-1767562_1280.jpg&#34; alt=&#34;Featured image of post Wyzwanie Java #6: Operacje wejścia - wyjścia - rozwiązanie&#34; /&gt;&lt;p&gt;Czas na rozwiązanie kolejnego wyzwania. Ten program także można było rozwiązać na wiele sposobów, wykorzystując różne możliwości języka Java. Poniżej jedno z możliwych rozwiązań:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.io;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Files;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Path;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Paths;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.StandardOpenOption;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.text.MessageFormat;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exercise&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Scanner scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Proszę podać nazwę pliku wejściowego: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String userSourceFilePath &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Proszę podać nazwę pliku wynikowego: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String userResultFilePath &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path sourcePath &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(userSourceFilePath);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path resultPath &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(userResultFilePath);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;exists&lt;/span&gt;(sourcePath)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;readAllLines&lt;/span&gt;(sourcePath);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Integer size &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(MessageFormat.&lt;span style=&#34;color:#a6e22e&#34;&gt;format&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;W pliku jest {0} linii.&amp;#34;&lt;/span&gt;, size));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;write&lt;/span&gt;(resultPath, size.&lt;span style=&#34;color:#a6e22e&#34;&gt;toString&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;getBytes&lt;/span&gt;(), StandardOpenOption.&lt;span style=&#34;color:#a6e22e&#34;&gt;CREATE&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// flaga CREATE tworzy plik jeśli nie istniał&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (Exception e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Błąd dostępu do pliku: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; userSourceFilePath);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Wyzwanie Java #6: Operacje wejścia - wyjścia</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%236-operacje-wej%C5%9Bcia-wyj%C5%9Bcia/</link>
            <pubDate>Sun, 20 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%236-operacje-wej%C5%9Bcia-wyj%C5%9Bcia/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/doors-1767562_1280.jpg&#34; alt=&#34;Featured image of post Wyzwanie Java #6: Operacje wejścia - wyjścia&#34; /&gt;&lt;p&gt;W dzisiejszym poście chcielibyśmy porozmawiać o operacjach wejścia wyjścia w Javie. Do tej pory nasze programy były zamknięte na świat, nie wykonywały żadnej komunikacji poza wyświetlaniem w konsoli informacji dla użytkownika i wczytywanie wprowadzonych przez niego danych. Jednak to zdecydowanie za mało, nasz program musi umieć robić takie rzeczy jak obsługa plików, komunikacja z bazami danych, przesyłanie i odbieranie danych po sieci czy integracja z innymi systemami lub urządzeniami.&lt;/p&gt;&#xA;&lt;h1 id=&#34;standardowe-wejście-i-wyjście&#34;&gt;Standardowe wejście i wyjście&#xA;&lt;/h1&gt;&lt;p&gt;Zaczniemy od standardowego wejścia i wyjścia w systemie operacyjnym. W naszym pierwszym wyzwaniu napisaliśmy taki program:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świecie!&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Scanner scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// przekazujemy standardowe wejście (System.in)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String userString &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Twój napis to: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; userString); &lt;span style=&#34;color:#75715e&#34;&gt;// korzystamy ze standardowego wyjścia (System.out)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wykorzystaliśmy w nim klasę &lt;em&gt;Scanner&lt;/em&gt; do komunikacji z użytkownikiem, dokładnie pobrania od niego imienia i wyświetlenia go w konsoli. Jednak klasa &lt;em&gt;Scanner&lt;/em&gt; komunikuje się z systemem operacyjnym by pobrać wpisany przez użytkownika tekst w terminalu, dlatego korzysta ze specjalnego strumienia systemowego, tak zwanych &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Standardowe_strumienie&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;standardowych strumieni&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-6-input-output/Stdstreams-notitle.svg.png&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;h4&gt;Standardowe strumienie (Wikipedia)&lt;/h4&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Strumienie są właśnie mechanizmem komunikacji z innymi zasobami systemowymi i przesyłanie między naszym programem a nimi danych. Strumień to tak naprawdę sekwencja bajtów.&lt;/p&gt;&#xA;&lt;p&gt;Na diagramie wyżej widzimy, że takie standardowe strumienie są w systemie trzy, standardowe wejście gdzie pobieramy informacje z klawiatury, standardowe wyjście gdzie wyświetlamy coś na ekranie oraz standardowe wyjście błędów gdzie także wyświetlamy coś użytkownikowi, ale są to informacje o błędach.&lt;/p&gt;&#xA;&lt;h1 id=&#34;zamykanie-strumieni&#34;&gt;Zamykanie strumieni&#xA;&lt;/h1&gt;&lt;p&gt;Wiele osób pytało, dlaczego w naszym kodzie musimy użyć metody &lt;em&gt;scanner.close&lt;/em&gt;. Wtedy było za wcześnie by to wytłumaczyć, więc zrobię to teraz.&lt;/p&gt;&#xA;&lt;p&gt;W artykule o świecie Javy opisałem, że dzięki specjalnemu &amp;ldquo;odśmiecaczowi&amp;rdquo; (garbage collector) Java sama zarządza pamięcią operacyjną i tutaj, w przeciwieństwie do niektórych języków, nie musimy tej pamięci ani alokować ani dealokować, czyli zwalniać na inne potrzeby. Ze strumieniami jest jednak inaczej, bo często dotyczą zasobów typu Input/Output inaczej IO, czyli wejścia wyjścia, gdzie korzystamy z zasobów systemowych, które trzeba zamykać. Jeśli tego nie zrobimy możemy spowodować problem zwany &amp;ldquo;Resource leak&amp;rdquo; czyli &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Resource_leak&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;wyciek zasobów&lt;/strong&gt;&lt;/a&gt;. Dlatego wszystkie zasoby inne niż pamięć takie jak uchwyty do plików, otwarte sockety i tym podobne, trzeba samodzielnie zamykać. Zwłaszcza, że systemy operacyjne pozwalają zwykle na ograniczoną ilość otwartych zasobów systemowych. Oczywiście, sam system operacyjny, a dokładnie jego kernel czyli jądro systemu, może uznać, że jakiś zasób zostanie zamknięty, nawet jeśli program sam tego nie zrobił, ale zwykle dzieje się to dopiero gdy nasz program zostanie wyłączony. W naszym krótkim programie nic takiego wielkiego się nie stanie, jeśli tego nie zrobimy, ale trzeba pamiętać, że w Javie tworzy się często oprogramowanie, które działa miesiącami lub nawet latami bez restartu i wtedy prawidłowa obsługa strumieni jest niezwykle ważna.&lt;/p&gt;&#xA;&lt;p&gt;W drugą stronę, jeśli spróbujemy zamknąć strumień dwukrotnie, lub wykonać jakąś akcję na nim po zamknięciu dostaniemy wyjątek &amp;ldquo;java.lang.IllegalStateException&amp;rdquo; lub podobny.&lt;/p&gt;&#xA;&lt;h1 id=&#34;obsługa-wyjątków&#34;&gt;Obsługa wyjątków&#xA;&lt;/h1&gt;&lt;p&gt;Zanim jednak pójdziemy dalej, musimy powiedzieć sobie o jeszcze jednej ważnej rzeczy, mianowicie obsłudze wyjątków. &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/essential/exceptions/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Wyjątek&lt;/strong&gt;&lt;/a&gt; to informacja, że w programie &amp;ldquo;coś poszło nie tak&amp;rdquo;. Problemem może być nasz kod, czyli typowy błąd programisty, ale niektóre błędy nie zależą od nas, na przykład chcemy odczytać plik który nie istnieje. W takiej sytuacji program &lt;strong&gt;wyrzuci wyjątek&lt;/strong&gt; mówiący o tym, że nie odnaleziono pliku. Takie wyjątki, możemy także sami &amp;ldquo;wyrzucać&amp;rdquo; (ang. throw), jeśli napotkamy sytuację nieprawidłową, np. gdy użytkownik próbuje podzielić przez zero w naszym kalkulatorze.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Wyjątki&lt;/strong&gt; w Javie to też jakieś obiekty, które dziedziczą po klasie &lt;strong&gt;java.lang.Exception&lt;/strong&gt;. Klasa &lt;strong&gt;Exception&lt;/strong&gt; dziedziczy zaś po klasie &lt;strong&gt;java.lang.Throwable&lt;/strong&gt;. Nie zagłębiając się zbytnio w szczegóły, nasze wyjątki powinny dziedziczyć po klasie &lt;strong&gt;Exception&lt;/strong&gt; a nie &lt;strong&gt;Throwable&lt;/strong&gt;, dlatego, że ta druga klasa jest także klasą po której dziedziczy klasa &lt;strong&gt;java.lang.Error&lt;/strong&gt;, która oznacza błędy krytyczne, np. związane z maszyną wirtualną, których to wyjątków także zwykła aplikacja nie obsługuje (łapie).&lt;/p&gt;&#xA;&lt;p&gt;Skoro jednak Java &amp;ldquo;wyrzuci&amp;rdquo; nam wyjątek, to musimy umieć go &amp;ldquo;złapać&amp;rdquo; (ang. catch). Służą do tego składnia &lt;strong&gt;Try-Catch&lt;/strong&gt; lub jej rozszerzenie &lt;strong&gt;Try-Catch-Finally&lt;/strong&gt; (ewentualnie można też Try-Finally):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// tutaj jakiś kod który może wyrzucić wyjątek&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (Exception e){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// ten kod zadziała tylko gdy będzie wyjątek&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;finally&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// tutaj robimy coś na koniec&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W Javie 7 wprowadzono jeszcze jedną wersję obsługi błędów, mianowicie tak zwany &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;try-with-resources&lt;/strong&gt;&lt;/a&gt;, który pokażę za chwilę na przykładzie.&lt;/p&gt;&#xA;&lt;p&gt;Pamiętajmy, że łapiemy klasę &lt;strong&gt;Exception&lt;/strong&gt; lub te które po niej dziedziczą, a nie klasę &lt;strong&gt;Throwable&lt;/strong&gt;!&lt;/p&gt;&#xA;&lt;p&gt;Wyjątki w Javie dzielą się także na te które musimy &amp;ldquo;łapać&amp;rdquo; (checked) oraz takie których nie trzeba łapać (unchecked). Te pierwsze dziedziczą po klasie &lt;strong&gt;Exception&lt;/strong&gt; zaś te drugie po klasie &lt;strong&gt;RuntimeException&lt;/strong&gt; (która sama dziedziczy po Exception). Więcej można o tej decyzji przeczytać &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tutaj&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli byśmy kiedyś chcieli stworzyć własną metodę która wyrzuca wyjątek, powinniśmy użyć wtedy słowa &lt;strong&gt;throws&lt;/strong&gt; mówiącego jakie wyjątki ona &amp;ldquo;może&amp;rdquo; wyrzucić, oraz słowa &lt;strong&gt;throw&lt;/strong&gt; gdy coś pójdzie nie tak i będziemy chcieli ten wyjątek wyrzucić:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;thisMethodThrowsException&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; Exception {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Exception(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Message...&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;obsługa-plików&#34;&gt;Obsługa plików&#xA;&lt;/h1&gt;&lt;p&gt;W tym wyzwaniu skupimy się na obsłudze plików. Wykorzystamy tutaj zarówno API dostępne od pierwszych wersji Javy jak i nowe API zwane &lt;strong&gt;NIO&lt;/strong&gt; (non-blocking I/O lub new I/O) wprowadzone w Javie 7.&lt;/p&gt;&#xA;&lt;h3 id=&#34;ścieżka-do-pliku&#34;&gt;Ścieżka do pliku&#xA;&lt;/h3&gt;&lt;p&gt;Pierwsze co nam będzie potrzebne, do ścieżka do pliku, czyli jego lokalizacja. W NIO służy do tego klasa &lt;strong&gt;Path&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Path pathToDirectory &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Path pathToFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz/hello.txt&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;odczyt-plików&#34;&gt;Odczyt plików&#xA;&lt;/h3&gt;&lt;p&gt;Teraz możemy odczytać zawartość pliku z podanej ścieżki. Wystarczy użyć do tego klasy &lt;strong&gt;Files&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; bytes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;readAllBytes&lt;/span&gt;(pathToFile);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Metoda zwraca nam zawartość w postaci tablicy bajtów. Gdy wiemy że ten plik jest tekstowy (u mnie taki jest), możemy przekonwertować to na obiekt klasy &lt;em&gt;String&lt;/em&gt; za pomocą:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String fileContent &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; String(bytes,Charset.&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultCharset&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Musimy jednak tam przekazać &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Zestaw_znak%C3%B3w&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;kodowanie&lt;/a&gt; naszego pliku. W powyższym przykładzie zakładamy, że plik jest zapisany w domyślnym kodowaniu.&lt;/p&gt;&#xA;&lt;p&gt;Cały nasz program będzie wyglądał tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.io;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.charset.Charset;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Files;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Path;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Paths;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InputOutputExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path pathToDirectory &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path pathToFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz/hello.txt&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; bytes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;readAllBytes&lt;/span&gt;(pathToFile);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            String fileContent &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; String(bytes,Charset.&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultCharset&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Zwartość pliku: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(fileContent);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (Exception e){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// ten kod zadziała tylko gdy będzie wyjątek&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dostaliśmy błąd obsługi pliku: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; e.&lt;span style=&#34;color:#a6e22e&#34;&gt;getMessage&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;finally&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// tutaj robimy coś na koniec&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;zapis-do-pliku&#34;&gt;Zapis do pliku&#xA;&lt;/h3&gt;&lt;p&gt;Jeśli nasz program zmienia zawartość pliku, możemy chcieć go na koniec zapisać. Nic prostszego, tutaj także wystarczy użyć klasy &lt;strong&gt;Files&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fileContent &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; więcej tekstu...&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// dopisujemy coś do pliku&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;write&lt;/span&gt;(pathToFile, fileContent.&lt;span style=&#34;color:#a6e22e&#34;&gt;getBytes&lt;/span&gt;(Charset.&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultCharset&lt;/span&gt;()), StandardOpenOption.&lt;span style=&#34;color:#a6e22e&#34;&gt;APPEND&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nasz program ostatecznie będzie wyglądał tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.io;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.charset.Charset;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Files;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Path;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Paths;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InputOutputExample&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path pathToFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz/hello.txt&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;byte&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; bytes &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;readAllBytes&lt;/span&gt;(pathToFile);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            String fileContent &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; String(bytes, Charset.&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultCharset&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Aktualna zawartość pliku: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(fileContent);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            fileContent &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; więcej tekstu...&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// dopisujemy coś do pliku&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;write&lt;/span&gt;(pathToFile, fileContent.&lt;span style=&#34;color:#a6e22e&#34;&gt;getBytes&lt;/span&gt;(Charset.&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultCharset&lt;/span&gt;()));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (Exception e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// ten kod zadziała tylko gdy będzie wyjątek&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dostaliśmy błąd obsługi pliku: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; e.&lt;span style=&#34;color:#a6e22e&#34;&gt;getMessage&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Istnieje także możliwość wczytania naszego pliku jako listy linii tekstu a następnie ich zapisu jak w poniższym przykładzie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.io;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Files;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Path;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Paths;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InputOutputExample2&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path pathToFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz/hello.txt&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;readAllLines&lt;/span&gt;(pathToFile);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Aktualna zawartość pliku: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(lines);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; więcej tekstu...&amp;#34;&lt;/span&gt;); &lt;span style=&#34;color:#75715e&#34;&gt;// dopisujemy coś do pliku&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;write&lt;/span&gt;(pathToFile, lines);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (Exception e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;// ten kod zadziała tylko gdy będzie wyjątek&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dostaliśmy błąd obsługi pliku: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; e.&lt;span style=&#34;color:#a6e22e&#34;&gt;getMessage&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Istnieje także możliwość użycia do tego Stream API z Java 8 (nie mylić ze strumieniami danych opisanymi powyżej), ale temu poświęcimy kolejne wyzwanie.&lt;/p&gt;&#xA;&lt;p&gt;Jednak z powyższymi metodami należy uważać gdy pliki są bardzo duże, bo w całości są wczytywane do pamięci. Jeśli nasz plik jest duży lepiej użyć strumienia do pliku i czytać go partiami, tak by w naszym programie nie zabrakło pamięci RAM, co mogłoby zawiesić lub zamknąć program.&lt;/p&gt;&#xA;&lt;p&gt;To samo tyczy się także plików binarnych, wtedy także nie możemy użyć powyższych metod.&lt;/p&gt;&#xA;&lt;h3 id=&#34;odczyt-strumieniowy-plików&#34;&gt;Odczyt strumieniowy plików&#xA;&lt;/h3&gt;&lt;p&gt;Musimy wtedy użyć bardziej niskopoziomowego (&amp;ldquo;surowego&amp;rdquo;) API i skorzystać z takich klas jak &lt;strong&gt;FileInputStream&lt;/strong&gt;, &lt;strong&gt;FileReader&lt;/strong&gt;, &lt;strong&gt;BufferedReader&lt;/strong&gt; lub &lt;strong&gt;Scanner&lt;/strong&gt;. Dwie pierwsze pracują wprost na bajtach, stąd wczytywania znak po znaku, kolejne już potrafią wczytać całe linie lub słowa. Poniżej przykład użycia tych czterech klas:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.io;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.BufferedReader;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.FileInputStream;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.FileReader;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.IOException;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InputOutputExample3&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String args&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz/hello.txt&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Przykład nr 1 - FileInputStream&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; (FileInputStream inputStream &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileInputStream(path)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; character &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; inputStream.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (character &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;print&lt;/span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;) character);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                character &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; inputStream.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// kończymy linię i zaczynamy nową&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (IOException e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Problem z odczytem pliku&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            e.&lt;span style=&#34;color:#a6e22e&#34;&gt;printStackTrace&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Przykład nr 2 - FileReader&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; (FileReader fileReader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileReader(path)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; character &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fileReader.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (character &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;print&lt;/span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt;) character);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                character &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fileReader.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// kończymy linię i zaczynamy nową&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (IOException io) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Problem z odczytem pliku&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            io.&lt;span style=&#34;color:#a6e22e&#34;&gt;printStackTrace&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Przykład nr 3 - BufferedReader&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; (BufferedReader bufferedReader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileReader(path))) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            String line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; bufferedReader.&lt;span style=&#34;color:#a6e22e&#34;&gt;readLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (line &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(line);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; bufferedReader.&lt;span style=&#34;color:#a6e22e&#34;&gt;readLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (IOException io) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Problem z odczytem pliku&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            io.&lt;span style=&#34;color:#a6e22e&#34;&gt;printStackTrace&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Przykład nr 4 - Scanner&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; (Scanner in &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileReader(path))) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (in.&lt;span style=&#34;color:#a6e22e&#34;&gt;hasNext&lt;/span&gt;()) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                String next &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; in.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;print&lt;/span&gt;(next &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (IOException io) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Problem z odczytem pliku&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            io.&lt;span style=&#34;color:#a6e22e&#34;&gt;printStackTrace&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym kodzie została użyta nowa składnia &lt;strong&gt;try-with-resources&lt;/strong&gt; wprowadzona w Javie 7. Pozwala ona na otwarcie strumienia we wnętrzu wyrażenia &lt;em&gt;try&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; (BufferedReader bufferedReader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileReader(path))) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;co powoduje, że Java sama na koniec zamknie ten strumień. Oznacza to, że nie musimy troszczyć się o problemy opisane powyżej, związane z wyciekami zasobów. Wcześniej, gdy nie było tej instrukcji, nasz kod musiałby wyglądać tak jak niżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.io;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.BufferedReader;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.FileReader;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.IOException;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InputOutputExample4&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String args&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz/hello.txt&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        BufferedReader fileReader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            fileReader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; BufferedReader(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; FileReader(path));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            fileReader.&lt;span style=&#34;color:#a6e22e&#34;&gt;readLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (IOException io) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Problem z odczytem pliku&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            io.&lt;span style=&#34;color:#a6e22e&#34;&gt;printStackTrace&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;finally&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fileReader &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;try&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    fileReader.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                } &lt;span style=&#34;color:#66d9ef&#34;&gt;catch&lt;/span&gt; (IOException e) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    e.&lt;span style=&#34;color:#a6e22e&#34;&gt;printStackTrace&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dochodzi nam blok &lt;strong&gt;finally&lt;/strong&gt; w którym zamykamy nasze strumienie. Kod w bloku finally wykonuje się zawsze, bez względu czy błąd wystąpił czy nie.&lt;/p&gt;&#xA;&lt;p&gt;Klasy takie jak &lt;strong&gt;InputStream&lt;/strong&gt; czy &lt;strong&gt;Reader&lt;/strong&gt; możemy także tworzyć wykorzystując klasę &lt;strong&gt;Files&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;InputStream inputStream &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;newInputStream&lt;/span&gt;(pathToFile)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BufferedReader bufferedReader &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;newBufferedReader&lt;/span&gt;(pathToFile, Charset.&lt;span style=&#34;color:#a6e22e&#34;&gt;defaultCharset&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;inne-operacje-na-plikach-i-katalogach&#34;&gt;Inne operacje na plikach i katalogach&#xA;&lt;/h3&gt;&lt;p&gt;Klasa &lt;strong&gt;Files&lt;/strong&gt; umożliwia nam wykonywanie wielu innych operacji na plikach i katalogach. Poniżej przykład kilku z nich:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.io;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.io.IOException;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Files;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Path;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.nio.file.Paths;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InputOutputExample5&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String args&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;) &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; IOException {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path pathToDirectory &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz-test&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path pathToFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz/hello1.txt&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Path pathToAnotherFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Paths.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/tmp/kodolamacz/hello2.txt&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;createDirectory&lt;/span&gt;(pathToDirectory); &lt;span style=&#34;color:#75715e&#34;&gt;// tworzy katalog&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;createDirectories&lt;/span&gt;(pathToDirectory); &lt;span style=&#34;color:#75715e&#34;&gt;// tworzy katalog z katalogami pośrednimi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;createFile&lt;/span&gt;(pathToFile); &lt;span style=&#34;color:#75715e&#34;&gt;// tworzy pusty plik&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;copy&lt;/span&gt;(pathToFile, pathToAnotherFile); &lt;span style=&#34;color:#75715e&#34;&gt;// kopiuje plik&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;delete&lt;/span&gt;(pathToAnotherFile); &lt;span style=&#34;color:#75715e&#34;&gt;// usuwa plik&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Files.&lt;span style=&#34;color:#a6e22e&#34;&gt;move&lt;/span&gt;(pathToFile, pathToAnotherFile); &lt;span style=&#34;color:#75715e&#34;&gt;// przenosi plik&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;wyzwanie&#34;&gt;Wyzwanie&#xA;&lt;/h1&gt;&lt;p&gt;Czas na nasze wyzwanie. Tym razem prosimy Was o napisanie programu który będzie operować na plikach.&lt;/p&gt;&#xA;&lt;p&gt;Niech program poprosi użytkownika o podanie ścieżki do pliku wejściowego oraz wyjściowego gdzie będzie wynik. Następnie niech program wczyta plik wejściowy, zliczy w nim ilość linii, wyświetli tą liczbę użytkownikowi i zapisze nazwę pliku oraz liczbę linii w pliku wyjściowym.&lt;/p&gt;&#xA;&lt;p&gt;Dla chętnych, prośba o dodanie obsługi błędów. Jeśli plik nie będzie istniał, niech program wyświetli o tym informację i poprosi o inny plik.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #5: Interfejsy i dziedziczenie - rozwiązanie</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%235-interfejsy-i-dziedziczenie-rozwi%C4%85zanie/</link>
            <pubDate>Fri, 18 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%235-interfejsy-i-dziedziczenie-rozwi%C4%85zanie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/coffee-3392168_1280.jpg&#34; alt=&#34;Featured image of post Wyzwanie Java #5: Interfejsy i dziedziczenie - rozwiązanie&#34; /&gt;&lt;p&gt;Pora na rozwiązanie kolejnego wyzwania z drugiej części programowania obiektowego. Tym razem mieliśmy zaprojektować klasy do systemu wypożyczalni pojazdów.&lt;/p&gt;&#xA;&lt;p&gt;To zadanie można rozwiązać na wiele sposobów, wszystko zależy od wymagań systemu i pomysłu programisty, dlatego bez obaw jeśli wasze klasy są kompletnie inne niż będą poniżej.&lt;/p&gt;&#xA;&lt;p&gt;Zaczynamy od modelowania pojazdów. Zakładamy, że mamy samochody osobowe, dostawcze, motocykle i maszyny robocze. Każdy z nich jest pojazdem silnikowym i zakładamy, że nie będzie innych, uproszczając tym model. W takim razie stworzymy cztery klasy odpowiadające tym pojazdom i abstrakcyjną klasę pojazdu &lt;em&gt;Vehicle&lt;/em&gt; (pomijamy podział na pliki *.java):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental.vehicle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vehicle&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Car&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Vehicle {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Motorbike&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Vehicle {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Van&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Vehicle {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;WorkingMachine&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Vehicle {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Każdy pojazd ma swój numer rejestracyjny, numer vin, kolor, cenę, spalanie, stan zbiornika paliwa oraz licznik przejechanych kilometrów, dlatego nasza klasa &lt;em&gt;Vehicle&lt;/em&gt; powinna zyskać następujące pola:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.engine.Engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vehicle&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String registrationNumber;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String vin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String color;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; price;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; combustion;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fuel;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; kilometers;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W zależności od typu, pojazdy mogą mieć dodatkowe cechy jak np. liczba drzwi w przypadku aut osobowych, której to cechy nie będą mieć motocykle. Dlatego dla przykładu klasa samochodu osobowego może wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental.vehicle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.Vehicle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Car&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Vehicle {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numberOfDoors;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pojazdy będą mieć silnik diesla, silnik na benzynę lub elektryczny. By spełnić ten wymóg stworzymy sobie &lt;strong&gt;interfejs&lt;/strong&gt; silnika (dowolnego, to ma być po prostu idea silnika):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental.engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Engine&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;drive&lt;/span&gt;(){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// domyślna metoda&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Interfejsy mają swoje &lt;em&gt;implementacje&lt;/em&gt; czyli klasy które spełniają ten interfejs. W naszym wymaganiach mamy trzy wersje silników, dlatego stworzymy trzy klasy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental.engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PetrolEngine&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; Engine {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DieselEngine&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; Engine {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ElectricEngine&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; Engine {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gdy mamy już &amp;ldquo;silniki&amp;rdquo; możemy uwzględnić to w naszym kodzie dla pojazdu, przez co nasza klasa zmieni się do takiej postaci:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.engine.Engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vehicle&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String registrationNumber;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String vin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String color;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; price;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; combustion;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fuel;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; kilometers;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; Engine engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zauważcie ostatnie pole &amp;ldquo;engine&amp;rdquo; typu &lt;em&gt;Engine&lt;/em&gt;, to właśnie nasz silnik w samochodzie. Ten sam samochód może mieć różne silniki, stąd tutaj mówimy że jest jakiś silnik, ale dopiero tworząc tą klasę &amp;ldquo;zainstalujemy&amp;rdquo; odpowiednią implementację!&lt;/p&gt;&#xA;&lt;p&gt;Nasze &amp;ldquo;pojazdy&amp;rdquo; miały mieć metody jedź oraz tankuj, zmieniające pola licznika kilometrów oraz stanu zbiornika paliwa, dlatego dodajmy je:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.engine.Engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vehicle&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String registrationNumber;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String vin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String color;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; price;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; combustion;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fuel;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; kilometers;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; Engine engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;drive&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; kilometers) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        engine.&lt;span style=&#34;color:#a6e22e&#34;&gt;drive&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// jadąc używamy silnika (metoda jest pusta, tylko pokazowo)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;kilometers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; kilometers; &lt;span style=&#34;color:#75715e&#34;&gt;// jadąc zwiększa się licznik kilometrów&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        fuel &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; combustion &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; kilometers; &lt;span style=&#34;color:#75715e&#34;&gt;// zmniejsza się ilość paliwa w zależności od spalania&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;refuel&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fuel) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fuel&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; fuel;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli zostawimy parametry jako &amp;ldquo;private&amp;rdquo; nikt z zewnątrz nie będzie miał do nich dostępu zarówno do zapisu jak i odczytu. Dlatego należałoby je zrobić jako dostępne (np. publiczne lub pakietowe) albo stworzyć możliwość dostępu do nich za pomocą odpowiednich metod (hermetyzacja). By móc stworzyć taką klasę należałoby dodać wtedy odpowiedni konstruktor lub ewentualnie metody dostępowe, tak zwane &amp;ldquo;settery&amp;rdquo;, które pozwoliłyby na ustawianie tych wartości. Z drugiej strony by móc odczytać wartości tych pól trzeba by było stworzyć metody dostępowe zwane &amp;ldquo;getterami&amp;rdquo;. Więcej o tym jak powinny wyglądać takie metody dostępowe, zarówno do zapisu pola (setter) jak i odczytu jego wartości (getter), można przeczytać w &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javaee/6/tutorial/doc/gjbbp.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;dokumentacji&lt;/a&gt;, jest to standard związany z Javą Enterprise Edition który dodaje tylko jako ciekawostkę dla osób które są już bardziej zaawansowane, w dalszej części ograniczymy się tylko do konstruktora, gdyż nie to było celem zadania.&lt;/p&gt;&#xA;&lt;p&gt;Dodajmy zatem konstruktor z wszystkimi parametrami. W idei jest to dość proste, wystarczy użyć skrótu &lt;em&gt;Alt + Insert&lt;/em&gt; i z listy wybrać opcję &lt;em&gt;Constructor&lt;/em&gt; a potem wybrać wszystkie pola i nacisnąć OK. Nasza klasa zacznie wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.engine.Engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vehicle&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String registrationNumber;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String vin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String color;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; price;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; combustion;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fuel;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; kilometers;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; Engine engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vehicle&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vehicle&lt;/span&gt;(String registrationNumber, String vin, String color, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; price, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; combustion, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fuel, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; kilometers, Engine engine) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;registrationNumber&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; registrationNumber;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;vin&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; vin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;color&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; color;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;price&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; price;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;combustion&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; combustion;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fuel&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fuel;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;kilometers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; kilometers;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;engine&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;drive&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; kilometers) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        engine.&lt;span style=&#34;color:#a6e22e&#34;&gt;drive&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// jadąc używamy silnika (metoda jest pusta, tylko pokazowo)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;kilometers&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; kilometers; &lt;span style=&#34;color:#75715e&#34;&gt;// jadąc zwiększa się licznik kilometrów&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        fuel &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; combustion &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; kilometers; &lt;span style=&#34;color:#75715e&#34;&gt;// zmniejsza się ilość paliwa w zależności od spalania&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;refuel&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fuel) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fuel&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; fuel;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Naszym pól w klasie jest całkiem sporo, przez co konstruktor wydaje się być skomplikowany, ale tak naprawdę jest bardzo prosty. W przyszłości moglibyśmy także pokusić się o zmniejszenie liczby tych parametrów korzystając z oddzielnych klas które je nam pogrupują lub kolekcji typu &lt;em&gt;Map&lt;/em&gt; która przechowa je w jednym polu. Dodatkowo dodaliśmy konstruktor domyślny by nasz wcześniejszy kod się skompilował.&lt;/p&gt;&#xA;&lt;p&gt;W klasie samochodu mieliśmy dodatkowe pole, dlatego tutaj też dodamy konstruktor plus użyjemy konstruktora z klasy &lt;em&gt;Vehicle&lt;/em&gt; żeby ustawić pozostałe parametry:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental.vehicle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.Vehicle;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.engine.Engine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Car&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Vehicle {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numberOfDoors;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Car&lt;/span&gt;(String registrationNumber, String vin, String color, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; price, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; combustion, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fuel, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; kilometers, Engine engine, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numberOfDoors) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;(registrationNumber, vin, color, price, combustion, fuel, kilometers, engine); &lt;span style=&#34;color:#75715e&#34;&gt;// tutaj konstruktor z klasy Vehicle, musi być jako pierwszy!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numberOfDoors&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numberOfDoors;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nasz program jest już prawie skończony, teraz wystarczy spróbować napisać kawałek kodu który użyje tych klas, na przykład tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.vehiclerental;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.engine.PetrolEngine;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.vehiclerental.vehicle.Car;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;VehicalRentalMain&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Car car &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Car(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;WZ 94567&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1M8GDM9A_KP042788&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Red&amp;#34;&lt;/span&gt;, 40000, 6, 75, 0, &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; PetrolEngine(), 5);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        car.&lt;span style=&#34;color:#a6e22e&#34;&gt;refuel&lt;/span&gt;(50); &lt;span style=&#34;color:#75715e&#34;&gt;// tankujemy 50 litrów paliwa&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        car.&lt;span style=&#34;color:#a6e22e&#34;&gt;drive&lt;/span&gt;(100); &lt;span style=&#34;color:#75715e&#34;&gt;// jedziemy 100 kilometrów&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oczywiście program jest bardzo prosty, chodziło nam jedynie tutaj o próbę stworzenia odpowiedniego modelu klas a nie gotowego systemu wypożyczalni pojazdów. Modelowanie jest zagadnieniem tak naprawdę niezwykle ważnym a zarazem wcale nie takim prostym. Dlatego by dowiedzieć się więcej o prawidłowym tworzeniu klas i ich modelowaniu polecam poczytanie więcej o&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Wzorzec_projektowy_%28informatyka%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wzorcach projektowych&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Domain-driven_design&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Domain Driven Design&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Na rynku jest dostępna ogromna ilość książek poświęcona powyższym tematom.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wprowadzenie do testowania aplikacji w środowisku Java</title>
            <link>https://bigdatapassion.pl/blog/wprowadzenie-do-testowania-aplikacji-w-%C5%9Brodowisku-java/</link>
            <pubDate>Wed, 16 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wprowadzenie-do-testowania-aplikacji-w-%C5%9Brodowisku-java/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/java/jenga-2583734_1280.jpg&#34; alt=&#34;Featured image of post Wprowadzenie do testowania aplikacji w środowisku Java&#34; /&gt;&lt;p&gt;W tym poście powiemy sobie o jednym z najważniejszych aspektów tworzenia oprogramowania, mianowicie jego testowanie.&lt;/p&gt;&#xA;&lt;p&gt;W środowisku programistów często powtarzane jest powiedzenie, że programowanie to tak naprawdę szukanie błędów i ich poprawianie. Christopher Thompson powiedział kiedyś: &amp;ldquo;Czasami bardziej opłaca się zostać w łóżku w poniedziałek niż spędzić resztę tygodnia, debugując poniedziałkowy kod&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Każdy kto zetknął się z błędem używanego przez siebie oprogramowania, dobrze wie, jak frustrujące może to być dla użytkownika. Niestety są rzeczy gorsze, niż niezadowolony klient, błędy w oprogramowaniu mogą nieść ze sobą dużo bardziej druzgocące skutki. W skutek błędu w maszynie do radioterapii Therac-25, niektórzy pacjenci dostawali zbyt dużą dawkę promieniowania, przez co zmarło 5 osób. W 1966 roku, po 5 minutach lotu, awarii doznała sonda kosmiczna Mariner, błąd wynikał z nieprawidłowego przepisania wzoru z kartki i kosztował około 18,5 milionów dolarów. Przez błąd systemu obrony przeciwrakietowej PATRIOT w 1991 roku, nie udało się uniknąć ataku rakiety która zabiła 28 amerykańskich żołnierzy. Poprawka programu została wprowadzona następnego dnia&amp;hellip; Zmiany w oprogramowaniu do projektowania CATIA i niezgodność wersji pomiędzy zespołami inżynierów pracujących nad projektem samolotu Airbus A380 spowodowały różnice w planach elektrycznych a tym samym niekompatybilność modułów, co spowodowało znaczne opóźnienie i dodatkowe koszta w wysokości ponad 6 miliardów dolarów. Błędy w oprogramowaniu przyczyniają się także do strat wynikających z użycia wirusów lub włamań komputerowych.&lt;/p&gt;&#xA;&lt;p&gt;By uniknąć tych małych jak i tych większych błędów naszego oprogramowania coraz więcej w IT mówi się o testowaniu aplikacji. Jest to zagadnienie bardzo szerokie, zaś takie testy mogą odbywać się na wielu płaszczyznach, dlatego my tylko skupimy się na testach wykonywanych przez inżynierów oprogramowania.&lt;/p&gt;&#xA;&lt;p&gt;Testowanie nie tylko zwiększa jakość i niezawodność naszego oprogramowania. Potrafi też znacząco ułatwić nam pracę. Początkowo, może się wydawać, że to strata czasu. Nasz projekt jest mały, mamy zapał do tworzenia nowego kodu a sprawdzenie czy wszystko działa zajmuje chwilę. Jednak z biegiem czasu, linijka za linijką, nasz kod jest coraz większy a program obsługuje coraz więcej funkcjonalności. Nagle przetestowanie wszystkiego by mieć pewność, że nasza mała zmiana nigdzie niczego nie popsuła potrafi zająć bardzo długi czas, a my mamy już dość robienia tego samego kolejny raz przez co przykładamy do tego mniej uwagi. W rezultacie boimy się wprowadzać większe zmiany, bo przecież &amp;ldquo;tamto działało&amp;rdquo; i chcemy ten stan zachować, zaś nasze testy są na tyle skąpe, że istnieje spora szansa, że i tak wszystkiego nie sprawdziliśmy. Tutaj z pomocą przychodzą nam właśnie testy. Stare powodzenie mądrego programisty mówi, jeśli robisz coś drugi raz ręcznie, zautomatyzuj to. Testy to nasz automat na usługach, który potrafi sprawdzić nam działanie naszego kodu i całej aplikacji w trakcie gdy my udamy się na krótką przerwę. Nie boimy się wprowadzać nawet największych zmian w naszym kodzie (np. tak zwanej &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Refaktoryzacja&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;refaktoryzacji&lt;/a&gt;), bo wiemy, że jeśli coś &amp;ldquo;popsujemy&amp;rdquo; to testy już o to zadbają, byśmy o tym wiedzieli. Takie testy także są dużo krótsze niż testowanie ręczne, samodzielne lub przez testerów, dlatego zachęcają do ich częstego używania, bez potrzeby uruchamiania naszej aplikacji. Dlatego okazuje się, że czas poświęcony na pisanie testów, w dłuższym rozrachunku do nas wraca! My za to śpimy spokojnie.&lt;/p&gt;&#xA;&lt;p&gt;Kolejną bardzo dużą zaletą pisania testów do swojego kodu, jest swoistego rodzaju dokumentacja naszego kodu. Patrząc na testy w naszym kodzie, widząc co one sprawdzają, jaka funkcjonalność jest testowana, możemy bardzo szybko poznać co ten program robi, bez potrzeby analizowania samego kodu, linijka po linijce. Jest to bardzo przydatne czytając czyjś kod. Pracując w dużym zespole zawsze będziemy czytać i przeglądać kod naszych kolegów, testy jednocześnie ułatwiają nam to, z drugiej strony pilnują czy nasze zmiany nie spowodują problemów z czyimś kodem. Tą relację można odwrócić, czyli pisać testy zgodnie z naszymi wymaganiami do systemu czy &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Przypadek_u%C5%BCycia&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;przypadkami użycia&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Bywają też takie przypadki, że trafiamy do projektu który jest już prowadzony od dłuższego czasu, mającego wiele linii, mnóstwo funkcjonalności, brakuje dokumentacji a my nawet nie mamy się kogo spytać co się tam dzieje. Często taka aplikacja zależy od niewspieranego już systemu, języka, frameworku czy innych narzędzi. Mówimy wtedy o tak zwanym &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Legacy_code&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&amp;ldquo;Legacy Code&amp;rdquo;&lt;/a&gt; (polskie tłumaczenie &amp;ldquo;Odziedziczony kod&amp;rdquo;). Niestety takie systemy także nie mają zwykle testów, przez co praca z takim kodem przypomina trochę chodzenie po polu minowym. Michael Feathers, autor bardzo popularnej książki &amp;ldquo;Working Effectively with Legacy Code&amp;rdquo;, nazywa wręcz systemy &amp;ldquo;legacy&amp;rdquo; właśnie takimi które nie mają testów, mają ich bardzo mało lub same testy są nieprawidłowe. Wtedy jedną z zalecanych metod pracy w takim systemie jest właśnie rozpoczęcie pracy od napisania testów do niego i tym samym częściowo spłacenie tak zwanego &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Technical_debt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&amp;ldquo;długu technologicznego&amp;rdquo;&lt;/a&gt;, czyli naprawienia niedociągnięć naszym poprzedników. Dobry zwyczaj skautów przecież nakazuje by pozostawiać swoje miejsce czystszym niż się je zastało!&lt;/p&gt;&#xA;&lt;p&gt;Kolejną dużą zaletą testów, jest pomoc w dbaniu o nasz kod i ogólną architekturę aplikacji (często używane jest tutaj bardzo popularne w świecie IT, francuskie słowo &amp;ldquo;design&amp;rdquo;, jednak odnosi się znaczeniowo do aspektu wizualnego, np. dzieła sztuki, stąd nie będziemy go nadużywać, polskim odpowiednikiem jest słowo &amp;ldquo;wzornictwo&amp;rdquo; którego tutaj pewnie by nikt nie użył&amp;hellip;). Okazuje się, że do złego kodu, gdzie panuje nieład i jest pisany niezgodnie ze sztuką, bardzo trudno napisać dobre testy. Bywają takie sytuacje, że to test powoduje, że programista upraszcza swój kod, by było go łatwiej przetestować a zyskuje na tym cały system.&lt;/p&gt;&#xA;&lt;p&gt;Ostatnią zaletą i zastosowaniem naszych testów, jest możliwość wykorzystania ich do uczenia się nowych bibliotek, frameworków czy narzędzi. Po prostu piszemy testy do funkcjonalności których chcemy użyć. Z drugiej strony wiele narzędzi o otwartym kodzie jest pozbawionych dokumentacji, bądź jest bardzo uboga i wtedy przeglądając testy twórców tego narzędzia można naprawdę bardzo szybko się nauczyć wykorzystania tego narzędzia.&lt;/p&gt;&#xA;&lt;p&gt;Podsumowując, piszemy testy by:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;tworzyć dobre przetestowane programy (minimalizujemy prawdopodobieństwo błędów działania)&lt;/li&gt;&#xA;&lt;li&gt;zapewnić lepszą architekturę (design) naszego systemu&lt;/li&gt;&#xA;&lt;li&gt;nie bać się zmian (refaktoryzacja kodu)&lt;/li&gt;&#xA;&lt;li&gt;nie psuć tego co było (regresja)&lt;/li&gt;&#xA;&lt;li&gt;szybka informacja że coś poszło nie tak&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Należy także pamiętać, że nie zawsze testy spełniają nasze powyższe wymagania. Dzieje się tak głownie wtedy gdy testy są bardzo słabe, niezgodne ze sztuką którą za chwilę będę chciał Wam przybliżyć. Wtedy niestety testy nie testują zbytnio naszego kodu, sprawiają tylko takie pozory, utrudniają nam pracę nad nowościami bo nagle ich utrzymanie i zmienianie wraz z systemem wymaga większego czasu niż pisanie samego kodu i dochodzimy do wniosku, że testy są niepotrzebne, wyłączamy je i ich już nie używamy albo wręcz usuwamy. Dlatego tak bardzo ważne jest, by nauczyć się pisać dobre testy, by dawały nam korzyści a nie były kulą u nogi.&lt;/p&gt;&#xA;&lt;h1 id=&#34;rodzaje-testów&#34;&gt;Rodzaje testów&#xA;&lt;/h1&gt;&lt;p&gt;W świecie IT spotykamy wiele różnych rodzajów testów. Wyróżniamy tutaj testy:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Jednostkowe&lt;/strong&gt; (tak zwane &lt;strong&gt;unit&lt;/strong&gt; testy) -  łatwe do tworzenia i modyfikacji, testują małą funkcjonalność, mały fragment kodu w oderwaniu od reszty systemu.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Integracyjne&lt;/strong&gt; (inaczej testy warstwy serwisów) - w tych testach skupiamy się na sprawdzeniu czy nasze moduły / komponenty / fragmenty kodu potrafią ze sobą współpracować, testujemy samą ich integrację, bez wnikania czy te moduły są prawidłowe, gdyż to robią testy jednostkowe.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;End-to-end&lt;/strong&gt; (inaczej funkcjonalne lub akceptacyjne) - testy całościowe, sprawdzają jakąś funkcjonalność systemu w sposób całościowy, np. od wejścia do wyjścia gdy przetwarzamy jakieś dane, niekiedy też tutaj pojawiają się testy warstwy interfejsu dla użytkownika, czyli tak zwane testy UI (user interface), choć nie każdy system komputerowy taką warstwę w ogóle ma.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Zdarza się, że ludzie wprowadzają dodatkowe typy testów jak testy wydajnościowe czy &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Test_penetracyjny&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;testy penetracyjne&lt;/a&gt; (związane z bezpieczeństwem informatycznym), jednak trzy powyższe grupy są najbardziej uniwersalne, by nie rzecz najważniejsze, stąd skupimy się głownie na nich. Niekiedy też powyższe grupy są rozbijane na mniejsze.&lt;/p&gt;&#xA;&lt;p&gt;Z racji tego, że testy jednostkowe są testy szybkie w działaniu, mają krótki kod i łatwo je tworzyć, znowu testy End-to-end są bardzo wolne, długotrwałe, trudne do napisania i utrzymania (edycji) stworzono coś takiego jak &lt;a class=&#34;link&#34; href=&#34;https://martinfowler.com/articles/practical-test-pyramid.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;piramida testów&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://bigdatapassion.pl/img/post/java/introduction-to-software-testing-in-java/piramid.png&#34;&gt;&lt;figcaption&gt;&#xA;&#x9;&#x9;&#x9;&lt;h4&gt;Piramida testów&lt;/h4&gt;&#xA;&#x9;&#x9;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Piramida ta określa nam, które testy powinny być dominujące w naszym systemie a których powinno być najmniej. Oczywiście nie trudno się domyślić, że to małe i szybkie testy jednostkowe zajmują miejsce na spodzie naszej piramidy, czyli jest ich najwięcej, zaś testy całościowe są najrzadsze. Testy integracyjne są w centrum naszej piramidy. Często ludzie podają tutaj proporcje 70% - 20% - 10% ale w piramidzie nie chodzi o to by się sztywno trzymać tych proporcji, bo jeśli widzimy potrzebę napisania dodatkowego testu End-to-end to go napiszmy, nawet gdyby to miało oznaczać, że będzie ich 11% a nie 10%. Traktujmy piramidę jako wskazówkę, testuj co się da testami jednostkowymi, nigdy ich nie żałuj a integracyjnych i całościowych używaj tyle ile trzeba. Gdy proporcje piramidy są zaburzone, zastanów się czy testy integracyjne i End-to-end nie powinny być zastąpione jednostkowymi, bo testują tylko niewielką funkcjonalność systemu.&lt;/p&gt;&#xA;&lt;h1 id=&#34;kiedy-pisać-testy&#34;&gt;Kiedy pisać testy&#xA;&lt;/h1&gt;&lt;p&gt;Większość programistów pisze swoje testy po napisaniu kodu, czyli najpierw mała funkcjonalność, potem test jednostkowy który ją sprawdza. Istnieje jednak inne podejście związane z pisaniem kodu, czyli &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Test-driven_development&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Test Driven Developmnet&lt;/strong&gt;&lt;/a&gt;. Technika zwana w skrócie &lt;strong&gt;TDD&lt;/strong&gt; zakłada pisanie testów na samym początku a dopiero potem kodu który zapewni w systemie spełnienie tego testu. Takie odwrócenie ma wiele zalet w stosunku do &amp;ldquo;klasycznego&amp;rdquo; podejścia, czyli twórz a potem sprawdź czy działa. Przede wszystkim, zawsze napiszemy te testy, nie ma tutaj miejsca na lenistwo lub brak czasu bo przekroczyliśmy termin oddania nowej funkcjonalności systemu. Takie testy przed kodem wymuszają także lepsze odwzorowanie testów i wymagań systemu a co za tym idzie testy są lepszej jakości i uwzględniają większą ilość kodu systemu podczas testowania (tak zwane pokrycie kodu testami).&lt;/p&gt;&#xA;&lt;p&gt;Technika ta została zaproponowana przez Kenta Becka i polega w dużym skrócie na tworzeniu oprogramowania w trzech powtarzających się fazach:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tworzymy testy do wymagań systemu (test oczywiście będzie nieudany na tym etapie)&lt;/li&gt;&#xA;&lt;li&gt;Piszemy kod danej funkcjonalności który ma zapewnić działanie testu&lt;/li&gt;&#xA;&lt;li&gt;Refaktoryzacja stworzonego kodu, tak by podnieść jego jakość i żeby spełniał standardy&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Fani TDD potocznie te fazy nazywają Red, Green, Refaktor.&lt;/p&gt;&#xA;&lt;h1 id=&#34;jak-to-wygląda-w-praktyce&#34;&gt;Jak to wygląda w praktyce&#xA;&lt;/h1&gt;&lt;p&gt;Można by długo jeszcze opowiadać o testach czysto teoretycznie, ale czas na kilka przykładów. Wykorzystamy do tego najpopularniejszą bibliotekę testującą dla środowiska Java jaką jest &lt;a class=&#34;link&#34; href=&#34;https://junit.org/junit5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;JUnit&lt;/strong&gt;&lt;/a&gt;. Dodatkowo skorzystamy z narzędzia &lt;strong&gt;Apache Maven&lt;/strong&gt; którego poznaliśmy tydzień temu. Na pokład wyciągniemy także program kalkulatora z wyzwania numer trzy.&lt;/p&gt;&#xA;&lt;p&gt;Wprowadziliśmy tam klasę &lt;strong&gt;Fraction&lt;/strong&gt; która miała reprezentować ułamek czyli licznik i mianownik wraz z częścią całkowitą.&lt;/p&gt;&#xA;&lt;p&gt;Zaczynamy więc od napisania powyższych wymagań, tworzymy pusty projekt zgodnie z postem dotyczącym &lt;em&gt;Apache Maven&lt;/em&gt; i zaczynamy programować tworząc taką klasę:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Na razie idzie prosto. Jednak klasa jeszcze nic nie potrafi, pola są prywatne (hermetyzacja), więc tworząc taką klasę nie mamy nawet do nich dostępu&amp;hellip; Dlatego stwórzmy sobie dodatkowo konstruktor tej klasy oraz funkcję która zwraca nam ułamek w postaci dziesiętnej, czyli po prostu typ &lt;strong&gt;double&lt;/strong&gt;. Dostajemy zatem taki kod:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsDecimal&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Na pierwszy rzut oka wszystko wygląda prawidłowo, konstruktor przyjmuje wszystkie trzy parametry, zaś metoda konwertująca do double zwraca zarówno część całkowitą jak i ułamek właściwy. Spróbujmy zatem to sprawdzić!&lt;/p&gt;&#xA;&lt;p&gt;Zaczynamy od dodania do &lt;em&gt;Mavena&lt;/em&gt; odpowiedniej biblioteki. Nasz plik &lt;strong&gt;pom.xml&lt;/strong&gt; powinien wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;project&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns:xsi=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a6e22e&#34;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;pl.kodolamacz&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;java-challenges&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.junit.jupiter&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;junit-jupiter-api&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;5.2.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.7.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;source&amp;gt;&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/source&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;target&amp;gt;&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Słowo &lt;strong&gt;scope&lt;/strong&gt; w &lt;em&gt;Mavenie&lt;/em&gt; ustawione na &lt;em&gt;test&lt;/em&gt; oznacza, że ta biblioteka będzie używana tylko do testów ale nie trafi dla przykładu do stworzonych plików &lt;em&gt;jar&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Dzięki JUnit możemy dodać swój pierwszy test w nowej klasie &lt;strong&gt;FractionTest&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import static&lt;/span&gt; org.junit.jupiter.api.Assertions.*;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FractionTest&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Klasy tej jednak nie tworzymy w ścieżce &amp;ldquo;scr/main/java&amp;rdquo; tylko w &amp;ldquo;src/test/java&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Jednak to dopiero początek, potrzebujemy metody która będzie testować naszą klasę &lt;em&gt;Fraction&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; org.junit.jupiter.api.Test;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import static&lt;/span&gt; org.junit.jupiter.api.Assertions.*;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FractionTest&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Test&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;shouldGetFractionAsDouble&lt;/span&gt;(){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// given&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// when&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak widać metoda swoją nazwą wprost pokazuje co tak naprawdę testuje, a właściwie czego wymaga od naszej klasy &lt;em&gt;Fraction&lt;/em&gt; czyli &amp;ldquo;powinna zwrócić ułamek jako typ double&amp;rdquo;. Dodatkowo metoda ta została oznaczona adnotacją &lt;strong&gt;@Test&lt;/strong&gt; wskazującą, że jest to metoda testowa i ma być specjalnie potraktowana przez framework testowy, czyli &lt;strong&gt;JUnit&lt;/strong&gt;. Takich adnotacji jest kilkanaście i są one opisane na w &lt;a class=&#34;link&#34; href=&#34;https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;dokumentacji projektu&lt;/a&gt;. Dzięki nim możemy na przykład sparametryzować testy, wykonywać jakieś akcje przed i po każdej metodzie testowej lub zbiorczo przed i po wszystkich metodach testowych w klasie testowej.&lt;/p&gt;&#xA;&lt;p&gt;Dodatkowo test został podzielony na trzy logiczne części:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;given - przygotowujemy dane testowe&lt;/li&gt;&#xA;&lt;li&gt;when - wykonujemy test&lt;/li&gt;&#xA;&lt;li&gt;then - sprawdzamy czy rezultat jest taki jak oczekiwany&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Nie jest to wymóg by tak pisać testy, jednak jest to dobry zwyczaj który polecam.&lt;/p&gt;&#xA;&lt;p&gt;Nasz test jednak jeszcze niczego nie robi, czas uzupełnić powyższe fazy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; org.junit.jupiter.api.Test;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import static&lt;/span&gt; org.junit.jupiter.api.Assertions.*;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FractionTest&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Test&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;shouldGetFractionAsDouble&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// given&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Fraction fraction &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(1, 1, 2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// when&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; fractionAsDecimal &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsDecimal&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        assertEquals(1.&lt;span style=&#34;color:#a6e22e&#34;&gt;5&lt;/span&gt;, fractionAsDecimal);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym kodzie w fazie &lt;em&gt;given&lt;/em&gt; stworzyliśmy obiekt typu &lt;em&gt;Fraction&lt;/em&gt;, czyli nasz ułamek, w fazie &lt;em&gt;when&lt;/em&gt; zwróciliśmy wartość double która ma ge reprezentować, zaś na koniec w fazie &lt;em&gt;then&lt;/em&gt; sprawdzamy czy 1 i 1/2 to faktycznie 1,5.&lt;/p&gt;&#xA;&lt;p&gt;Do sprawdzania używamy tak zwanych &lt;strong&gt;asercji&lt;/strong&gt; czyli specjalnych metod z frameworku &lt;strong&gt;JUnit&lt;/strong&gt; lub dodatkowej biblioteki, które pozwalają nam porównać wartość zwróconą z wartością oczekiwaną.&lt;/p&gt;&#xA;&lt;p&gt;Uruchamiamy test (w idei np. klikając go prawym przyciskiem myszy i wybierając opcję &lt;em&gt;Run&lt;/em&gt;) i ku naszemu zdziwieniu dostajemy błąd:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;org.opentest4j.AssertionFailedError: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Expected :1.5&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Actual   :1.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &amp;lt;Click to see difference&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;at org.junit.jupiter.api.AssertionUtils.fail&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;AssertionUtils.java:56&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;at org.junit.jupiter.api.AssertEquals.failNotEqual&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;AssertEquals.java:197&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;at org.junit.jupiter.api.AssertEquals.assertEquals&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;AssertEquals.java:74&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;at org.junit.jupiter.api.AssertEquals.assertEquals&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;AssertEquals.java:69&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;at org.junit.jupiter.api.Assertions.assertEquals&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Assertions.java:443&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;at pl.kodolamacz.math.FractionTest.shouldGetFractionAsDouble&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;FractionTest.java:18&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;Native Method&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wygląda na to, że metoda która zwraca &lt;em&gt;double&lt;/em&gt; ma błąd, tak zwany &lt;strong&gt;bug&lt;/strong&gt;. Dzieje się tak dlatego, że dzieląc licznik przez mianownik oraz sumując go z częścią całkowitą pracujemy na liczbach typu &lt;em&gt;int&lt;/em&gt;, czyli całkowitych, a dopiero potem wynik konwertujemy do typu &lt;em&gt;double&lt;/em&gt;. Niestety przez to nasz wynik traci częścią niecałkowitą podczas operowania na liczbach całkowitych, stąd zamiast 1,5 dostajemy tylko wartość 1.&lt;/p&gt;&#xA;&lt;p&gt;Należy zatem w klasie &lt;em&gt;Fraction&lt;/em&gt; napisać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsDecimal&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;) numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gdy uruchomimy nasz test ponownie, dostajemy &amp;ldquo;zielony&amp;rdquo; wynik, czyli wszystko jest jak należy!&lt;/p&gt;&#xA;&lt;h1 id=&#34;narzędzia-do-testowania-aplikacji-napisanych-w-języku-java&#34;&gt;Narzędzia do testowania aplikacji napisanych w języku Java&#xA;&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;JUnit&lt;/strong&gt; nie jest jednym narzędziem używanym do testowania aplikacji, jest ich właściwie coraz więcej. Polecam przyjrzeć się takim projektom jak:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://testng.org/doc/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;TestNG&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://site.mockito.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Mockito&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/powermock/powermock&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;PowerMock&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://joel-costigliola.github.io/assertj/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;AssertJ&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://hamcrest.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Hamcrest&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://arquillian.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Arquillian&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://spockframework.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Spock&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://staffwww.dcs.shef.ac.uk/people/A.Simons/jwalk/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;JWalk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://grinder.sourceforge.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Grinder&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jmeter.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;JMeter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://pitest.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;PIT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://cucumber.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Cucumber&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://jbehave.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;JBehave&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.seleniumhq.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Selenium&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Do sprawdzania pokrycia kodu testami możemy użyć:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.jacoco.org/jacoco/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;JaCoCo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://cobertura.github.io/cobertura/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Cobertura&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;To nie są jedyne narzędzia wspomagające testowanie aplikacji w języku Java, jednak z całą pewnością jedna z najpopularniejszych i warto się przyjrzeć tym projektom.&lt;/p&gt;&#xA;&lt;h1 id=&#34;zakończenie&#34;&gt;Zakończenie&#xA;&lt;/h1&gt;&lt;p&gt;W tym poście chciałem Was zachęcić do testowania swojego kodu. Pokazałem zalety takiego testowania oraz podstawy ich tworzenia w środowisku Java. Niestety temat testowania aplikacji jest bardzo szeroki i długo można by było o nim mówić, dlatego już we własnym zakresie polecam dalsze zgłębianie tej wiedzy.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #5: Interfejsy i dziedziczenie</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%235-interfejsy-i-dziedziczenie/</link>
            <pubDate>Sat, 12 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%235-interfejsy-i-dziedziczenie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/coffee-3392168_1280.jpg&#34; alt=&#34;Featured image of post Wyzwanie Java #5: Interfejsy i dziedziczenie&#34; /&gt;&lt;p&gt;W trzecim naszym wyzwaniu wprowadziliśmy Was w świat programowania obiektowego. Zrozumienie tego paradygmatu jest niezwykle ważne, by biegle posługiwać się językiem Java a także wieloma innymi językami obiektowymi. Niestety zrozumienie go i prawidłowe pisanie naszych programów obiektowych, nie jest wcale takie proste, dlatego wymaga większego zaangażowania i czasu by prawidłowo przyswoić niezbędną wiedzę.&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym naszym wyzwaniu, chcielibyśmy powtórzyć wiedzę którą poznaliśmy na temat programowania obiektowego i ją rozszerzyć.&lt;/p&gt;&#xA;&lt;p&gt;Powiemy sobie o najważniejszych założeniach paradygmatu obiektowego, czyli:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Dziedziczeniu&lt;/li&gt;&#xA;&lt;li&gt;Polimorfiźmie&lt;/li&gt;&#xA;&lt;li&gt;Hermetyzacji&lt;/li&gt;&#xA;&lt;li&gt;Abstrakcji&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;dziedziczenie&#34;&gt;Dziedziczenie&#xA;&lt;/h1&gt;&lt;p&gt;Wyobraźmy sobie, że chcemy stworzyć aplikację dla pobliskiego ZOO. W tym systemie pracownicy wprowadzali by informacje o wszystkich zwierzętach którymi się opiekują. Dla przykładu, wśród zwierząt mielibyśmy lwy, tygrysy, słonie, żyrafy, papugi, orły i wiele wiele innych zwierząt. Przystępując do pracy na pewno stworzylibyśmy takie klasy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Lion&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Eagle&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Parrot&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Każde z naszych zwierząt ma jakieś cechy, dla przykładu wagę, wiek oraz imię. Żeby móc w naszym programie zapisać te cechy, nasze klasy muszą mieć do tego odpowiednie pola, zatem nasz kod zacznie wyglądać jak poniżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Lion&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Eagle&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Parrot&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dla ułatwienia, wszystkie zmienne oznaczymy jako &amp;ldquo;public&amp;rdquo;, choć docelowo dowiemy się, że nie jest to zbyt dobry pomysł. Jak widać, każdemu z naszym zwierząt możemy przypisać wszystkie trzy powyższe cechy, na przykład tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ZooApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hadoop&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 7000;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 11;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dumboo&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 6000;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 77;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jednak każdy od razu widzi, że w powyższym kodzie, powielamy w każdym obiekcie te same klasy! Od razu się nasuwa pytanie, czy nie można tego zrobić sprawniej, czyli poprzez zapisanie tego raz i współdzielenie z innymi klasami? Właśnie do tego służy &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;dziedziczenie&lt;/strong&gt;&lt;/a&gt;. Dzięki niemu, możemy stworzyć oddzielną klasę, np. zwierzę i &lt;em&gt;odziedziczyć&lt;/em&gt; po niej zestaw cech które ma każde zwierzę!&lt;/p&gt;&#xA;&lt;p&gt;Nasz kod dzięki temu może wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Animal&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Lion&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Eagle&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Parrot&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;polimorfizm&#34;&gt;Polimorfizm&#xA;&lt;/h1&gt;&lt;p&gt;Dzięki stworzeniu klasy &lt;em&gt;Animal&lt;/em&gt; i odziedziczeniu po niech zestawu cech dzięki słowu kluczowemu &lt;em&gt;extends&lt;/em&gt;, wszystkie klasy zwierząt także mają te cechy. Dlatego nasz program w klasie &lt;em&gt;ZooApplication&lt;/em&gt; może pozostać bez zmian.&lt;/p&gt;&#xA;&lt;p&gt;Dzieje się tak dlatego, że obiekty &lt;em&gt;elephant1&lt;/em&gt; i &lt;em&gt;elephant2&lt;/em&gt; z klasy &lt;em&gt;ZooApplication&lt;/em&gt; są jednocześnie słoniami (klasa Elephant) ale także zwierzętami (klasa Animal). Inaczej mówiąc, mają cechy z każdej z tych klas i można je w naszym programie traktować zarówno jako obiekty typu Elephant jak i Animal. Pokazuje to poniższy kod, gdzie obydwa obiekty zostały dodane do teoretycznie dwóch innych zbiorów.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.ArrayList;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ZooApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hadoop&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 7000;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 11;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dumboo&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 6000;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 77;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Lion lion1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Lion();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Simba&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 100;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 24;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Elephant&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; elephants &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephants.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephants.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// elephants.add(lion1); // Tak nie możemy zrobić, lew nie jest słoniem!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Animal&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; animals &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(lion1); &lt;span style=&#34;color:#75715e&#34;&gt;// Tak już możemy, lew jest zwierzęciem!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba słoni: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; elephants.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba zwierząt: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Takie zachowanie nazywamy &lt;strong&gt;polimorfizmem&lt;/strong&gt; czyli wielopostaciowością.&lt;/p&gt;&#xA;&lt;p&gt;W świecie Java, każdy obiekt &lt;em&gt;dziedziczy&lt;/em&gt; po wspólnym &amp;ldquo;przodku&amp;rdquo;, jest nim klasa &lt;strong&gt;java.lang.Object&lt;/strong&gt;. Mimo, że tworząc swoją klasę, nie piszemy tego wprost, każda klasa która nie ma słowa &lt;em&gt;extend&lt;/em&gt; rozszerza właśnie klasę &lt;em&gt;Object&lt;/em&gt;. Oczywiście, jak chcemy, możemy napisać, że nasza klasa rozszerza klasę &lt;em&gt;Object&lt;/em&gt;, ale jest to po prostu zbędne.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-5-interfaces-and-inheritance/classes-object.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Trzeba także pamiętać, że dziedziczenie w Javie odbywa się zawsze zgodnie z zasadą &lt;strong&gt;IS-A&lt;/strong&gt;, czyli &lt;strong&gt;jest&lt;/strong&gt;, co oznacza, że słoń jest zwierzęciem, ale nie każde zwierze jest słoniem. Nie ma zatem w Javie takiego &amp;ldquo;dziedziczenia&amp;rdquo;, jakie znamy z biologii, czyli dziecko &amp;ldquo;dziedziczy&amp;rdquo; po swoich rodzicach, bo dziecko &lt;em&gt;nie jest&lt;/em&gt; swoją mamą ani &lt;em&gt;nie jest&lt;/em&gt; swoim ojcem, jednak wszyscy &lt;em&gt;są&lt;/em&gt; ludźmi.&lt;/p&gt;&#xA;&lt;h1 id=&#34;hermetyzacja&#34;&gt;Hermetyzacja&#xA;&lt;/h1&gt;&lt;p&gt;Podczas dziedziczenia nie tylko cechy, czytaj pola klasy, są dziedziczone z innej klasy. Dotyczy to także metod. Jeśli nasza klasa &lt;em&gt;Animal&lt;/em&gt;, miałaby jakieś metody, wszystkie klasy &amp;ldquo;potomne&amp;rdquo;, także będą mieć te metody (z dokładnością do widoczności o czym powiemy za chwilę).&lt;/p&gt;&#xA;&lt;p&gt;Nasze &amp;ldquo;zwierze&amp;rdquo;, ma trzy cechy, imię, wiek i wagę. Imię jest cechą którą nadajemy, zaś wiek zmienia się wraz ze starzeniem się a waga jedząc. Nie wnikając w szczegóły i biologię ssaków, nasz program uwzględniający powyższe zasady powinien wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Animal&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Nazwyam zwierzę&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(String name) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Starzeje się, więc mój wiek wzrasta...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Jem więc staję się cięższy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.ArrayList;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ZooApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hadoop&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(7000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(11);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dumboo&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(6000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(77);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Lion lion1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Lion();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Simba&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(100);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(24);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// tutaj ciąg dalszy ...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zauważmy, że oprócz dodanie trzech nowych metod, nasze pola zmieniły się z &lt;em&gt;public&lt;/em&gt; na &lt;em&gt;private&lt;/em&gt;, czyli teraz nikt poza metodami z tej klasy, nie będzie miał dostępu do tych cech. Jakakolwiek zmiana ich wartości będzie wymagała dostępu przez metody &lt;em&gt;setName&lt;/em&gt;, &lt;em&gt;eat&lt;/em&gt; i &lt;em&gt;growOld&lt;/em&gt;. Takie &amp;ldquo;ukrycie&amp;rdquo; implementacji, czyli wewnętrznego zachowania, nazywamy &lt;strong&gt;hermetyzacją&lt;/strong&gt;. W praktyce, będziemy bardzo często spotykać się z hermetyzacją w naszych programach, pozwala ona na uniknięcie wielu potencjalnych błędów i ułatwia pisanie dużych programów, o czym sami się kiedyś przekonacie.&lt;/p&gt;&#xA;&lt;h1 id=&#34;abstrakcja&#34;&gt;Abstrakcja&#xA;&lt;/h1&gt;&lt;p&gt;W naszym programie możemy stworzyć obiekty czterech klas: &lt;em&gt;Lion, Elephant, Eagle oraz Parrot&lt;/em&gt;. Jednak, w celu ułatwienia sobie pisania kodu, stworzyliśmy dodatkową klasę &lt;em&gt;Animal&lt;/em&gt; po której dziedziczą wszystkie inne i która służy do przechowania wszystkich &amp;ldquo;wspólnych&amp;rdquo; metod i cech obiektów. Jednak nikt nikomu nie zabroni napisania czegoś takiego w naszym programie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Animal nieWiemCoTo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Animal();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;czyli stworzenia obiektu klasy &lt;em&gt;Animal&lt;/em&gt;. Nie powinno tak być, gdyż nie ma w przyrodzie po prostu &amp;ldquo;zwierząt&amp;rdquo;, są za to lwy, słonie, orły i papugi. W języku polskim, pojęcia nie mające odpowiednika w konkretnym przedmiocie, coś bardziej ogólnego nazywamy &lt;a class=&#34;link&#34; href=&#34;https://sjp.pwn.pl/sjp/abstrakcja;2438476.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;abstrakcją&lt;/strong&gt;&lt;/a&gt;. Tak samo jest i w Javie, to znaczy, klasy które są bytami ogólnymi, używanymi do celów dziedziczenia, ale nie służą do tworzenia żadnych konkretnych bytów, czyli obiektów, nazywamy &lt;strong&gt;klasami abstrakcyjnymi&lt;/strong&gt;. By stworzyć klasę abstrakcyjną, wystarczy użyć słowa &lt;em&gt;abstract&lt;/em&gt; w kodzie jak pokazano poniżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Animal&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Nazwyam zwierzę&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(String name) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Starzeje się, więc mój wiek wzrasta...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Jem więc staję się cięższy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Od teraz już nikt w naszym programie, nie będzie mógł stworzyć obiektu z klasy &lt;em&gt;Animal&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Klasy abstrakcyjne, mogę mieć także metody abstrakcyjne, czyli takie które muszą być stworzone w klasie dziedziczącej po niej, lecz tutaj jedynie stwierdzamy, że taka metoda ma powstać. Gdyby chcieć nasze metody zmienić w abstrakcyjne, wystarczyłoby napisać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Animal&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Nazwyam zwierzę&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(String name);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Starzeje się, więc mój wiek wzrasta...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Jem więc staję się cięższy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Za chwilę poznamy inny mechanizm &amp;ldquo;zmuszenia&amp;rdquo; programisty do napisania jakichś metod, mianowicie &lt;em&gt;interfejsy&lt;/em&gt;. Zauważmy, że metody abstrakcyjne, nie mają ciała, jedynie definiujemy nazwę, parametry, zwracany typ oraz widoczność metody.&lt;/p&gt;&#xA;&lt;h1 id=&#34;widoczność-pól-i-metod&#34;&gt;Widoczność pól i metod&#xA;&lt;/h1&gt;&lt;p&gt;W dziedziczeniu pól i metod jest jednak pewne ograniczenie, mianowicie, nie można odziedziczyć pól i metod oznaczonych jako &lt;em&gt;private&lt;/em&gt;, użycie tego słowa zamiast &lt;em&gt;public&lt;/em&gt; spowodowałoby, że tylko metody znajdujące się w klasie &lt;em&gt;Animal&lt;/em&gt; miałyby dostęp do tego pola. Tak stało się z polami, gdy wprowadziliśmy trzy metody dostępu do pól, czyli &lt;em&gt;eat&lt;/em&gt;, &lt;em&gt;setName&lt;/em&gt; i &lt;em&gt;growOld&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Dla przypomnienia, jeszcze raz tabela modyfikatorów dostępu wraz z oznaczeniem kto ma dostęp do danego pola lub metody:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Klasa&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Pakiet&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Podklasa&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Wszyscy&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;public&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;protected&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;default&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;private&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h1 id=&#34;dziedziczenie-i-przesłanianie-metod&#34;&gt;Dziedziczenie i przesłanianie metod&#xA;&lt;/h1&gt;&lt;p&gt;Z dziedziczeniem metod, wiąże się jeszcze jedna bardzo ważna cecha, metody można nadpisywać. Wszystkie zwierzęta jedzą, jednak różne zwierzęta, mogą jeść w inny sposób. Wyobraźmy sobie, że u słoni tylko połowa jedzenia jest przetwarzana na masę (waga), zaś u wszystkich innych zwierząt będzie to całość. Nasz kod mógłby wyglądać na przykład tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Animal&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Nazwyam zwierzę&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(String name) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Starzeje się, więc mój wiek wzrasta...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Jem więc staję się cięższy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; 3&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;4 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Słoń je trochę inaczej&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; 1&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak widzimy, słoń, czyli klasa &lt;em&gt;Elephant&lt;/em&gt; ma własną wersję metody &lt;em&gt;eat&lt;/em&gt;, mimo że w klasie &lt;em&gt;Animal&lt;/em&gt; już jest ona stworzona. Mówimy tutaj o nadpisaniu metody, co dodatkowo zaznaczone jest nieobowiązkową adnotację &lt;strong&gt;@Override&lt;/strong&gt;. W tym momencie, gdy wykonamy metodę &lt;em&gt;eat&lt;/em&gt; na obiektach klasy &lt;em&gt;Elephant&lt;/em&gt;, zostanie użyta nowa implementacja.&lt;/p&gt;&#xA;&lt;p&gt;Z racji tego, że przy wielokrotnym dziedziczeniu, tworzy się coś w rodzaju drzewa klas, zawsze używana jest implementacja z klasy będącej najdalej od klasy &lt;em&gt;Object&lt;/em&gt; w tym drzewie. Przypomina to trochę stos kart, gdzie zawsze bierzemy to co najbliżej góry i zawsze kolejna karta nadpisuje te pod spodem.&lt;/p&gt;&#xA;&lt;p&gt;Powyższy kod będzie jednak działał pod warunkiem, że pole &lt;em&gt;weight&lt;/em&gt; w klasie &lt;em&gt;Elephant&lt;/em&gt; nie będzie prywatne (patrz tabela modyfikatorów dostępu). Oznaczać to wtedy będzie, że nie możemy z tego pola skorzystać w klasie Elephant. Możemy jednak wtedy wywołać metodę &lt;em&gt;eat&lt;/em&gt; z klasy po której dziedziczymy. Można to zrobić za pomocą słowa &lt;strong&gt;super&lt;/strong&gt;. Poniżej przykład użycia tego słowa:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Słoń je trochę inaczej&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(1 &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; 2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; weight);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak widać w metodzie &lt;em&gt;eat&lt;/em&gt; klasy &lt;em&gt;Elephant&lt;/em&gt; odwołujemy się do metody &lt;em&gt;eat&lt;/em&gt; klasy &lt;em&gt;Animal&lt;/em&gt;. Oczywiście, w tej metodzie możemy odwołać się także do każdej innej metody z klasy &lt;em&gt;Animal&lt;/em&gt; lub &lt;em&gt;Elephant&lt;/em&gt;, jednak gdy w obydwu klasach będą istniały metody o tej samej nazwie, czytaj nadpisane, wtedy słowo &lt;em&gt;super&lt;/em&gt; pozwala nam wskazać, że chcemy wykonać metodę z klasy po której dziedziczymy lub innej niżej w hierarchii klas w drzewie dziedziczenia.&lt;/p&gt;&#xA;&lt;h1 id=&#34;konstruktory&#34;&gt;Konstruktory&#xA;&lt;/h1&gt;&lt;p&gt;Wiemy, że do stworzenia obiektu, używana jest &amp;ldquo;specjalna&amp;rdquo; metoda zwana konstruktorem. Okazuje się, że one także podlegają zasadą dziedziczenia. Tworząc nowy obiekt, najpierw wykonywany jest konstruktor klasy &lt;em&gt;Object&lt;/em&gt; a następnie po kolei wszystkie konstruktory powyżej, czyli w naszym przypadku najpierw konstruktor klasy &lt;em&gt;Animal&lt;/em&gt; a następnie konstruktor klasy &lt;em&gt;Elephant&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Także w przypadku konstruktorów, można skorzystać ze słowa &lt;strong&gt;super&lt;/strong&gt;, z tym, że nie używamy wtedy znaku kropki. Poniżej przykład użycia dwóch różnych konstruktorów:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;abstract&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Animal&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; String name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Animal&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tworzę zwierzę bez imienia...&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Animal&lt;/span&gt;(String name) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tworzę zwierzę o imieniu &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; name);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Nazwyam zwierzę&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(String name) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Starzeje się, więc mój wiek wzrasta...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Jem więc staję się cięższy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;weight&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; 3 &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; 4 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; weight;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// tą linijkę można pominąć, jest domyślna&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tworzę słonia bez imienia...&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt;(String name) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;(name); &lt;span style=&#34;color:#75715e&#34;&gt;// wybieramy konstruktor z parametrem&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tworzę słonia o imieniu &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; name);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Słoń je trochę inaczej&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(1 &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; 2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; weight);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.ArrayList;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ZooApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hadoop&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(7000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(11);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dumboo&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// elephant2.setName(&amp;#34;Dumboo&amp;#34;); // już niepotrzebne, mamy konstruktor&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(6000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(77);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po uruchomieniu programu dostaniemy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tworzę zwierzę bez imienia...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tworzę słonia bez imienia...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tworzę zwierzę o imieniu Dumboo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Tworzę słonia o imieniu Dumboo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;interfejsy&#34;&gt;Interfejsy&#xA;&lt;/h1&gt;&lt;p&gt;A teraz sobie skomplikujmy sytuację. Mamy cztery zwierzęta: słoń, lew, papuga, orzeł. Dwa z nich to ssaki, dwa ptaki. Dwa są mięsożerne, dwa nie. Pojawia się problem, jak zbudować drzewo dziedziczenia przy takich relacjach. Można by spróbować wprowadzić dodatkowe klasy dla ssaków i patków, wtedy słoń dziedziczył by po ssaku, zaś ssak po zwierzęciu, czyli klasie &lt;em&gt;Animal&lt;/em&gt;. Jednak to nie rozwiąże problemu z jedzeniem mięsa, bo nie każdy ssak jest mięsożerny i nie każdy ptak również. Dlatego by rozwiązać ten problem, wymyślono zupełnie inny mechanizm zwany &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;interfejsami&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Interfejs&lt;/strong&gt; to zestaw wymagań które stawiamy przed danym obiektem/klasą. W praktyce przekłada to się na zestaw metod które ta klasa musi mieć, by mogła &lt;strong&gt;implementować&lt;/strong&gt; ten interfejs. Dlatego mówimy o interfejsach i ich &lt;em&gt;implementacjach&lt;/em&gt;. Każdy interfejs może mieć wiele implementacji, oraz dowolna klasa może implementować wiele interfejsów.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład takiego interfejsu dla mięsożercy i roślinożercy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Carnivore&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eatMeat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Herbivore&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eatPlant&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ich użycie zaś będzie wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Elephant&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; Herbivore {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Słoń je trochę inaczej&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;super&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(1 &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; 2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; weight);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eatPlant&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        eat(weight); &lt;span style=&#34;color:#75715e&#34;&gt;// Nie ma słowa super, używamy metody eat z klasy Elephant!!!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Lion&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; Carnivore{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eatMeat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        eat(weight); &lt;span style=&#34;color:#75715e&#34;&gt;// tutaj także słowo super nie jest potrzebne bo nie ma konfliktu nazw&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Parrot&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;extends&lt;/span&gt; Animal &lt;span style=&#34;color:#66d9ef&#34;&gt;implements&lt;/span&gt; Herbivore {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;@Override&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eatPlant&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        eat(weight);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dzięki temu zabiegowi słoń będący obiektem klasy &lt;em&gt;Elephant&lt;/em&gt; jest zwierzęciem ale także roślinożercą. Odbywa się to dzięki użyciu słowa specjalnego &lt;strong&gt;implements&lt;/strong&gt; w klasie implementującej dany interfejs.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład użycia interfejsów w naszym programie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.ArrayList;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.List;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ZooApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Hadoop&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(7000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant1.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(11);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Elephant elephant2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Elephant();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dumboo&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(6000);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephant2.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(77);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Lion lion1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Lion();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Simba&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;eat&lt;/span&gt;(100); &lt;span style=&#34;color:#75715e&#34;&gt;// możemy tak&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;eatMeat&lt;/span&gt;(100); &lt;span style=&#34;color:#75715e&#34;&gt;// lub tak&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// lion1.eatPlant(100); // ale nie tak...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        lion1.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(24);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Parrot parrot1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Parrot();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parrot1.&lt;span style=&#34;color:#a6e22e&#34;&gt;setName&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ara&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parrot1.&lt;span style=&#34;color:#a6e22e&#34;&gt;eatPlant&lt;/span&gt;(1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        parrot1.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(5);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Elephant&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; elephants &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephants.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        elephants.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Animal&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; animals &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(lion1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(parrot1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Herbivore&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; herbivores &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        herbivores.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        herbivores.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(elephant2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        herbivores.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(parrot1); &lt;span style=&#34;color:#75715e&#34;&gt;// papuga jest rożlinożercą!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// herbivores.add(lion1); // tak nie można!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba słoni: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; elephants.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba roślinożerców: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; herbivores.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba zwierząt: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; animals.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Od wersji ósmej języka Java, interfejsy mogą mieć także domyślne implementacje metod, nie tylko jak powyżej, samą definicję, że takie metody mają istnieć:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.zoo;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Carnivore&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;eatMeat&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; weight);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;roar&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ROARRRRR....&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dzięki temu, każda klasa implementująca interfejs &lt;em&gt;Carnivore&lt;/em&gt; będzie potrafiła &amp;ldquo;ryczeć&amp;rdquo;. Jednak nic nie stoi na przeszkodzie, by nadpisać tą implementację własną. Interfejsy mogą także mieć pola i metody statyczne.&lt;/p&gt;&#xA;&lt;h1 id=&#34;wyzwanie&#34;&gt;Wyzwanie&#xA;&lt;/h1&gt;&lt;p&gt;A teraz czas na wyzwanie. Tym razem zadanie będzie projektowe a nie algorytmiczne jak było to w przypadku wyzwania dotyczącego Algorytmów i struktur danych w Javie.&lt;/p&gt;&#xA;&lt;p&gt;Celem wyzwania jest stworzenie klas do systemu wypożyczalni pojazdów. Każdy pojazd ma swój numer rejestracyjny, numer vin, kolor, cenę, spalanie, stan zbiornika paliwa oraz licznik przejechanych kilometrów. Samochody dzielimy na osobowe, dostawcze, motocykle i maszyny robocze. W zależności od typu, pojazdy mogą mieć dodatkowe cechy jak np. liczba drzwi w przypadku aut osobowych, której to cechy nie będą mieć motocykle. Pojazdy będą mieć silnik diesla, silnik na benzynę lub elektryczny. Należy korzystając z klas i interfejsów stworzyć model obiektowy tego systemu. Całość należy przetestować analogicznie do klasy ZooApplication, tworząc po kilka przykładowych samochodów. Klasy powinny mieć odpowiednie konstruktory oraz metody jedź oraz tankuj, zmieniające pola licznika kilometrów oraz stanu zbiornika paliwa.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wprowadzenie do Apache Maven, czyli jak tworzy się projekty w świecie Java</title>
            <link>https://bigdatapassion.pl/blog/wprowadzenie-do-apache-maven-czyli-jak-tworzy-si%C4%99-projekty-w-%C5%9Bwiecie-java/</link>
            <pubDate>Thu, 10 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wprowadzenie-do-apache-maven-czyli-jak-tworzy-si%C4%99-projekty-w-%C5%9Bwiecie-java/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/java/coffee-1867659_1280.jpg&#34; alt=&#34;Featured image of post Wprowadzenie do Apache Maven, czyli jak tworzy się projekty w świecie Java&#34; /&gt;&lt;p&gt;Projekty informatyczne mają to do siebie, że z czasem się bardzo rozrastają. Sam proces budowania aplikacji staje się dość skomplikowany. Zbudowanie jednego projektu może być uzależnione od zbudowania innego, wersje projektów/bibliotek z czasem mogą się zmieniać na wyższe lub po prostu dochodzić mogą nowe biblioteki. Programiści są leniwi - nie będzie przecież taki człowiek teraz brał i ręcznie ściągał nowe wersje bibliotek i zastępował starsze. Albo pamiętał, że najpierw musi zbudować projekt CommonUtils aby potem projekt MailService mógł korzystać z nowych klas, które można wykorzystać do wysyłania emaili. Mało tego - taki programista musi pamiętać, aby przed zbudowaniem aplikacji - odpalić wszystkie testy, które sprawdzą czy jakaś funkcjonalność przez przypadek nie została zepsuta podczas aktualnych prac.&lt;/p&gt;&#xA;&lt;p&gt;Programiści postanowili więc stworzyć narzędzie, które będzie te wszystkie czynności (i wiele więcej) robiło samo. Mało tego, ma ono pamiętać jaki projekt od którego zależy, w przypadku zmian wersji bibliotek sam ma to zauważyć i sam ściągnąć je z Internetu, ma sam odpalić testy i pilnować aby przechodziły a na koniec tak zbudowaną aplikację wrzucić na serwer produkcyjny i odpalić nowo zbudowaną aplikację. Czyż to nie piękne? Ile rzeczy, które dotychczas były na głowie programisty zniknęło? Programista ma zająć się pisaniem kodu a nie konfigurować, pamiętać, wykonywać jakieś magiczne skrypty itp.&lt;/p&gt;&#xA;&lt;p&gt;Na tego typu okazję został stworzony Maven jako następca już prawie wymarłego ANT&amp;rsquo;a. Maven potrafi zrobić wszystko z naszym projektem podczas jego budowania. Jedyne co my musimy zrobić to zastosować się do konwencji nazewnictwa katalogów w projekcie jaką wymaga Maven. Jeśli to zrobimy - to już sam Maven zatroszczy się o kompilowanie kodu, wykonywanie testów itp. My jedynie będziemy mu wydawali polecenia - on sam ogarnie resztę.&lt;/p&gt;&#xA;&lt;p&gt;Dlaczego to wszystko jest ważne? Oprócz oczywistych oszczędności czasu i odbarczeniem programisty rzeczami, które on nie powinien się zajmować - można wyróżnić szereg innych zalet jakie daje &lt;em&gt;Automatyzacja procesu budowania aplikacji&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;automatyczna kompilacja kodu&lt;/li&gt;&#xA;&lt;li&gt;usunięcie starych plików z poprzedniego budowania aplikacji&lt;/li&gt;&#xA;&lt;li&gt;pilnowanie kolejności budowania modułów aplikacji (pilnowanie zależności projektu od projektu)&lt;/li&gt;&#xA;&lt;li&gt;pilnowanie bibliotek oraz ich wersji&lt;/li&gt;&#xA;&lt;li&gt;wykonywanie testów aplikacji&lt;/li&gt;&#xA;&lt;li&gt;generowanie pliku .jar (.war) z naszą aplikacją&lt;/li&gt;&#xA;&lt;li&gt;generowanie dokumentacji&lt;/li&gt;&#xA;&lt;li&gt;uniwersalność środowiska/konfiguracji - działa u mnie? powinno działać u Ciebie!&lt;/li&gt;&#xA;&lt;li&gt;i wiele innych&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Wszystkie te rzeczy składają się na jeden wielki proces budowania naszej aplikacji. Gdybyśmy przecież chcieli zbudować aplikację sami krok po kroku to bardzo często byśmy gdzieś się pomylili, o czymś zapomnieli. Wtedy aplikacja nie zbuduje się, bądź zbuduje się niepoprawnie - a my nawet możemy nie być tego świadomi. Maven zatroszczy się o wszystko. Począwszy od stworzenia projektu poprzez kompilację, testy jednostkowe, integracyjne, tworzenie dokumentacji i deploy&amp;rsquo;owanie gotowego programu w miejscu docelowym. Wszystko za pomocą nawet jednej komendy. Mało tego - jeśli ściągamy jakąś bibliotekę, która wymaga do swojego działania innej (zależy od niej) to Maven to zauważy i dociągnie tą zależność. Często jest tak, że ściągając jakąś bibliotekę - dociąga ponad 20-30 bibliotek zależnych (nasza biblioteka zależała od biblioteki B, B zależała od C i D, D od F oraz J…..). Śmiem twierdzić, że samemu próbując ściągać kolejne biblioteki, odpalając program i zauważając w logach, że brakuje kolejnej - dociągać ją, znów patrzeć w logi… i próbować te 30 bibliotek ściągać ręcznie - po 1h darowalibyśmy sobie przygodę z programowaniem. Na szczęście jest Maven :)&lt;/p&gt;&#xA;&lt;p&gt;Zamiast opowiadać o Mavenie - zobaczmy go w akcji.&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-mavena&#34;&gt;Instalacja Mavena&#xA;&lt;/h1&gt;&lt;p&gt;Mavena się instaluje w swoim systemie. Instalacja - to może za dużo powiedziane - rozpakowuje się go z archiwum i dodaje plik mvn do PATH systemu, aby można było go używać w systemie. Więcej &lt;a class=&#34;link&#34; href=&#34;https://maven.apache.org/install.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tutaj&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jednak gdy korzystamy z &lt;strong&gt;IntelliJ IDEA&lt;/strong&gt; to mamy tam wbudowaną wersję Mavena która nam w zupełności wystarczy.&lt;/p&gt;&#xA;&lt;h1 id=&#34;pierwsza-aplikacja-stworzona-za-pomocą-apache-maven&#34;&gt;Pierwsza aplikacja stworzona za pomocą Apache Maven&#xA;&lt;/h1&gt;&lt;p&gt;Rozpocznijmy więc od stworzenia naszej pierwszej aplikacji zarządzanej przez Mavena. Wybieramy w IntelliJ IDEA:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;File → New → Project…&lt;/li&gt;&#xA;&lt;li&gt;Zakładka Maven → wybieramy wersję Java SDK na 10 → Next&lt;/li&gt;&#xA;&lt;li&gt;Wypełniamy pola:&#xA;** GroupId: wpiszmy np. pl.kodolamacz&#xA;** ArtifactId: firstApp&#xA;** Version: 1.0-SNAPSHOT&lt;/li&gt;&#xA;&lt;li&gt;klikamy Next&lt;/li&gt;&#xA;&lt;li&gt;nazywamy projekt firstApp i wskazujemy jego lokalizację na dysku → klikamy Next&lt;/li&gt;&#xA;&lt;li&gt;klikamy Finish&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;W ten sposób powstał szkielet naszej aplikacji. Gdy przyjrzymy się temu co powstało - zobaczymy następującą strukturę katalogów:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|- src &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     |- main &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     |     &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     |     |- java&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     |     |- resources&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     |- test&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|           &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|           | - java&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|           | - resources&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|- target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|- pom.xml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wyjaśnijmy co jest czym:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Folder&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Znaczenie&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;src/main/java&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;nasz kod Java projektu (tu kodujemy)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;src/main/resources&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;pliki konfiguracyjne dla klas Java, np. dla różnych bibliotek itp.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;src/test/java&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;kod Java dla testów aplikacji&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;src/test/resources&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;pliki konfiguracyjne dla klas testowych&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;target&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;folder gdzie Maven produkuje wszystkie owoce swojej pracy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;pom.xml&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;główny plik konfiguracyjny projektu&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Czym są foldery &lt;em&gt;resources&lt;/em&gt;? Wykorzystuje się często do umieszczania wszelkiej maści plików pomocniczych. Bardzo często wykorzystujemy w projektach jakieś pliki które inicjują naszą aplikację (jakieś nasze własne pliki słowników wczytywane podczas startu aplikacji) albo pliki konfiguracyjne elementów aplikacji - wtedy dobrym miejscem na ich umieszczenie są foldery resources. Różnica między tym umieszczonym w folderze src a tym umieszczonym w folderze &lt;em&gt;test&lt;/em&gt; jest taka, że ten z folderu test jest wykorzystywany w fazie testowania aplikacji (sprawdzania czy aplikacja działa jak powinna) i nie zostanie dołączony do finalnego pliku naszej aplikacji (np. jar) podczas budowania.&lt;/p&gt;&#xA;&lt;p&gt;No dobrze - posiadamy już jakiś kod, którym możemy zarządzać Mavenem. Aby to jednak zrobić musimy być świadomi jak pracuje Maven. Zamysł jego działania opiera się o tzw. cykle życia (build lifecycle). Cykle życia składają się z faz, które są kolejnymi elementami na drodze od kodu źródłowego do projektu uruchomionego np. na serwerze. Istnieją 3 podstawowe cykle życia:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;clean - czyści po sobie poprzednie efekty budowania aplikacji (często oznacza to wyczyszczenie folderu target)&lt;/li&gt;&#xA;&lt;li&gt;site - buduje dokumentację projektu (np. tzw. javadoc)&lt;/li&gt;&#xA;&lt;li&gt;domyślny cykl, który z kolei składa się z następujących faz (w prawidłowej kolejności):&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Faza&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Wyjaśnienie&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;validate&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;validuje strukture projektu&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;compile&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;kompiluje kod źródłowy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;test&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;uruchamia testy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;package&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;tworzy artifact w katalogu określonym jako ‚target’&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;integration-test&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;deploy artifaktu w środowisku integracyjnym&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;integration-test&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;uruchamia walidacje paczki&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;install&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;instaluje paczke w lokalnym repozytorium&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;deploy&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;kopiuje artifact na serwer&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Każda faza zależy od poprzedniej. Wydając więc polecenie &lt;em&gt;mvn compile&lt;/em&gt; Maven najpierw wykona fazę validate a następnie compile. No dobrze, w takim razie użyjmy pierwszy raz Mavena.&lt;/p&gt;&#xA;&lt;p&gt;Po prawej stronie w IDE będziemy mieć zakładkę &lt;em&gt;Maven Projects&lt;/em&gt;. Znajdziemy tam drzewa, gdzie korzej będzie nazywał się jak nasza aplikacja, czyli &lt;em&gt;firstApp&lt;/em&gt;, zaś pod nim będzie gałąź &lt;em&gt;Lifecycle&lt;/em&gt; oraz &lt;em&gt;Plugins&lt;/em&gt;. Z listy cykli życia (Lifecycle) klikamy dwa razy lewym przyciskiem myszy na opcji &lt;em&gt;clean&lt;/em&gt; a następnie analogicznie na opcji &lt;em&gt;install&lt;/em&gt;. Jak zobaczymy - dużo będzie działo się w konsoli. Maven po kolei będzie wykonywał to co mu powiedzieliśmy. Z reguły pierwsze uruchomienie powoduje, że budowanie trwa dłużej gdyż Maven musi sobie pościągać niezbędne biblioteki. Skutek pracy pojawi się w katalogu &lt;em&gt;target&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;koncepcja-repozytoriów&#34;&gt;Koncepcja repozytoriów&#xA;&lt;/h1&gt;&lt;p&gt;Maven działa na zasadzie trzymania wybudowanych projektów w repozytoriach (wytworzonych w fazie install). Co to wszystko znaczy? Jeśli przyjrzymy się w logi fazy (install) zauważymy, że na końcu były logi w stylu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;INFO&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; --- maven-install-plugin:2.4:install &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;default-install&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; @ firstApp ---&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;INFO&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Installing /home/acacko/IdeaProjects/firstApp/target/firstApp-1.0-SNAPSHOT.jar to /home/acacko/.m2/repository/pl/kodolamacz/firstApp/1.0-SNAPSHOT/firstApp-1.0-SNAPSHOT.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;INFO&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Installing /home/acacko/IdeaProjects/firstApp/pom.xml to /home/acacko/.m2/repository/pl/kodolamacz/firstApp/1.0-SNAPSHOT/firstApp-1.0-SNAPSHOT.pom&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po co robi to Maven? Po co zbudowaną aplikację wrzuca od razu do repozytorium utworzonym w jednym z katalogów naszego komputera? Odpowiedź jest prosta: gdybyśmy chcieli za chwilę użyć jej w innym projekcie - Maven znajdzie ją sobie w repozytorium. Tak z resztą się często dzieje - gdy nasza aplikacja składa się z kilku podprojektów (tzw. modułów) - to Maven buduje najpierw te, które nie zależą od innych projektów, następnie wrzuca je do repozytorium a potem przechodzi do kolejnych projektów - a gdy któryś kolejny projekt potrzebuje kodu projektu już zbudowanego wcześniej - Maven po prostu sięga po jego kod do repo. Nieco później poznamy jeszcze większą zaletę tego podejścia - ale to jeszcze chwilka.&lt;/p&gt;&#xA;&lt;h1 id=&#34;plik-pomxml---sercem-naszej-aplikacji&#34;&gt;Plik pom.xml - sercem naszej aplikacji&#xA;&lt;/h1&gt;&lt;p&gt;To, że nasza aplikacja jest taka super - w zasadzie wynika tylko z jednej rzeczy - posiada ona plik pom.xml. Przyjrzyjmy się temu plikowi. Po kliknięciu na pom.xml wybieramy opcję surowego podglądu xml&amp;rsquo;a. Inne okienka są dla amatorów :)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;project&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns:xsi=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a6e22e&#34;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- to na górze jest zawsze takie samo, poniżej jest to co nas interesuje --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;pl.kodolamacz&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;firstApp&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ta część: „project xmlns=„http://&amp;hellip;” jest jaka jest - nie musimy się przejmować, że nie wiemy co to jest. Taka jest konwencja i tyle. Bardziej interesują nas informacje, które są potem:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Tag&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Wyjaśnienie&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;groupId&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;twórca (pl.edu.uksw)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;artifactId&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;nazwa aplikacji (firstApp)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;packaging&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;sposób pakowania aplikacji (jar, war, ear, pom). My znamy tylko jar&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;version&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;wersja naszej aplikacji&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;name&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;nazwa wyświetlana (opcjonalnie)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;url&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;link do strony projektu (opcjonalnie)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;dependencies&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;zależności od innych modułów (opcjonalnie)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;To jest podstawowa wersja pom.xml, która zawiera minimalną ilość informacji i funkcjonalności. Przyjrzyjmy się schematowi całego tego pliku:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;project&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns:xsi=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;                      http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- The Basics --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;packaging&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/packaging&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;parent&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/parent&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependencyManagement&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependencyManagement&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;modules&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/modules&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- Build Settings --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;reporting&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/reporting&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- More Project Information --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;description&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;url&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/url&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;inceptionYear&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/inceptionYear&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;licenses&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/licenses&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;organization&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/organization&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;developers&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/developers&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;contributors&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/contributors&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- Environment Settings --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;issueManagement&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/issueManagement&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;ciManagement&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/ciManagement&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;mailingLists&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/mailingLists&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;scm&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/scm&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;prerequisites&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/prerequisites&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;pluginRepositories&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/pluginRepositories&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;distributionManagement&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/distributionManagement&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;profiles&amp;gt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/profiles&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cóż - trochę tego jest. W Mavenie można zdziałać cuda - ale za długo by zmieścić je w jednym artykule. Skupimy się na tych najważniejszych.&lt;/p&gt;&#xA;&lt;h1 id=&#34;zależności&#34;&gt;Zależności&#xA;&lt;/h1&gt;&lt;p&gt;Co to jest zależność? Jest to projekt od którego zależy nasz projekt. Często jest tak, że gdy piszemy coś w projekcie np. aplikacji internetowej to zależeć ona będzie od projektu, który potrafi zapisywać dane do bazy danych. Dołączamy sobie więc w naszym projekcie zależność do projektu zarządzania bazą danych. Maven podłączy potrzebne kody do naszego projektu tak abyśmy mogli używać obiektów z tamtego projektu. Z resztą - może nawet za daleko szukamy - przecież każda biblioteka jakiej używamy w projekcie jest zależnością. Wszak nasz projekt jej potrzebuje do swojego działania. Niech teraz Maven martwi się aby gdzieś ją znaleźć i podłączyć do naszego projektu.&lt;/p&gt;&#xA;&lt;p&gt;Wróćmy do naszego problemu katalogu ludzi po ich wieku. Pewnie zauważyliśmy, że jest to nieco męczące aby co chwila wrzucać do mapy nowy Set bo inaczej leciały nam NullPointery przy próbie wrzucenia pierwszej osoby o danym wieku. Kod wygląda amatorsko i można zrobić w nim pełno błędów. No więc co? Programista szuka pomocy w google: &amp;ldquo;Java Map with Multiple Values&amp;rdquo; i co? Otwieramy pierwszą stronę naszej ulubionej strony i co widzimy? Najwyżej ocenione jest nasze podejście - wrzucanie Set&amp;rsquo;ów do Mapy - przyznam, że podejście amatorskie - ale szybkie. Trzecie rozwiązanie jest przy użyciu biblioteki Apache Commons Collections 4 i obiektu MultiValueMap. Wygląda spoko więc użyjmy jej w naszym projekcie. Co należy zrobić? Wpisujemy sobie w google: &amp;ldquo;Apache Collections 4 maven&amp;rdquo; i wchodzimy w pierwszy &lt;a class=&#34;link&#34; href=&#34;https://mvnrepository.com/artifact/org.apache.commons/commons-collections4/4.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;link&lt;/a&gt;. Jest tam informacja, że Maven posiada tą bibliotekę w swoim repozytorium centralnym. Daje garść informacji o niej oraz to co najważniejsze - kod xml, aby przekopiować do pliku pom. Zróbmy to, pamiętając z ogólnego schematu, że zależności podaje się w bloku &lt;!-- raw HTML omitted --&gt;…&lt;!-- raw HTML omitted --&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;project&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns:xsi=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a6e22e&#34;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;pl.kodolamacz&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;firstApp&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.commons&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;commons-collections4&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;IntelliJ IDEA powinna w tle ogarnąć, że zmienił się POM i spróbować zaciągnąć zależności poprzez uruchomienie w tle Mavena. Jeśli nie, należy jak poprzednio uruchomić opcję &lt;em&gt;clean&lt;/em&gt; oraz &lt;em&gt;install&lt;/em&gt;. W IDE pojawi się ona na liście z lewej strony w dziale &amp;ldquo;External Libraries&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Podczas budowania aplikacji (Maven install) zauważymy, jak nasza biblioteka jest ściągana z Internetu… a następnie wrzucana do naszego repozytorium (~/.m2/repository/…). Jeśli za chwilę drugi raz będziemy budować - Maven tylko sprawdzi czy nic się nie zmieniło z tą wersją biblioteki odczytując sumę kontrolną - a następnie stwierdzi, że ma już tą bibliotekę zaciągniętą wcześniej - i użyje jej. Zajmie to wtedy dużo mniej czasu.&lt;/p&gt;&#xA;&lt;h1 id=&#34;pluginy&#34;&gt;Pluginy&#xA;&lt;/h1&gt;&lt;p&gt;Maven posiada wiele pluginów, które potrafią rozszerzyć funkcjonalności Mavena. Począwszy od możliwości wskazywania wersji Javy jaką chcemy użyć a skończywszy na pluginach, które potrafią same połączyć się ze zdalnym serwerem i podmienić wersję aplikacji na tą właśnie zbudowaną i zrestartować maszynę.&lt;/p&gt;&#xA;&lt;p&gt;Zacznijmy więc od tego najbardziej powszechnego - ustawiającego wersję Javy na taką jaką chcemy. Gdzie umieszczamy nasze pluginy? Nie widać ich w ogólnym schemacie xml. Nie widać ich bo umieszczamy je w sekcji &lt;!-- raw HTML omitted --&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;project&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a6e22e&#34;&gt;xmlns:xsi=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;         &lt;span style=&#34;color:#a6e22e&#34;&gt;xsi:schemaLocation=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;modelVersion&amp;gt;&lt;/span&gt;4.0.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/modelVersion&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;pl.kodolamacz&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;firstApp&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0-SNAPSHOT&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.commons&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;commons-collections4&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;4.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;build&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-compiler-plugin&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.7.0&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;source&amp;gt;&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/source&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;target&amp;gt;&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/target&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Spróbuj zmienić wersję Javy np. na 1.3 i zobaczy czy skompiluje się kod. Jeśli IDE nie zauważy co się stało w POM to zawsze robimy clean potem install a następnie w zakładce Maven Projects → Reimport All Maven Projects (pierwsza ikonka na górze od lewej)&lt;/p&gt;&#xA;&lt;p&gt;Pluginów jest mnóstwo i do wszystkiego. Zależnie co chcemy - pewnie już zostało to już zrobione. Część z nich już są zainstalowane domyślnie. Możemy je odnaleźć w zakładce Maven Projects → firstApp → Plugins.&lt;/p&gt;&#xA;&lt;h1 id=&#34;inne-rzeczy-które-powinieneś-wiedzieć&#34;&gt;Inne rzeczy, które powinieneś wiedzieć&#xA;&lt;/h1&gt;&lt;p&gt;Poza prostym budowaniem projektu i ściąganiem niezbędnych bibliotek, Maven potrafi znacznie więcej. Warto poznać takie zagadnienia jak choćby:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Używanie pliku settings.xml, który pozwala ustawić konfigurację dla wszystkich projektów - np. listę repozytoriów Mavena, hasła do GIT, jakieś wartości parametrów itp,&lt;/li&gt;&#xA;&lt;li&gt;Tworzenie tzw. Parent POM&amp;rsquo;a, który daje możliwość zarządzać wieloma projektami, które „dziedziczą” właściwości po tym POMie. Można w jednym miejscu np. zmienić wersję biblioteki na nowszą - i wszystkie projekty będą miały ją zaktualizowaną bez potrzeby szukania jej po wszystkich POM innych projektów&lt;/li&gt;&#xA;&lt;li&gt;Tworzenie tzw. modułów czyli wielu podprojektów składających się na jeden projekt. Np. często jest tak, że jeden podprojekt odpowiada za komunikację z bazą danych zaś inny podprojekt odpowiadający za aplikację desktop&amp;rsquo;ową go używa, oraz inny podprojekt odpowiadający za aplikację WEBową też go używa. Każdy z nich dodaje go do swojej zależności (dependency).&lt;/li&gt;&#xA;&lt;li&gt;Używanie parametrów w projektach&lt;/li&gt;&#xA;&lt;li&gt;Używanie profili Mavena&lt;/li&gt;&#xA;&lt;li&gt;i wiele innych&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Mimo że Maven jest jednym z najpopularniejszych rozwiązań w świecie JVM do zarządzania budowaniem projektów, ma swoją konkurencję. Jednym z ciekawszych tego typu projektów jest &lt;a class=&#34;link&#34; href=&#34;https://gradle.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Gradle&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #4: Algorytmy i struktury danych w języku Java - rozwiązanie</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%234-algorytmy-i-struktury-danych-w-j%C4%99zyku-java-rozwi%C4%85zanie/</link>
            <pubDate>Thu, 10 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%234-algorytmy-i-struktury-danych-w-j%C4%99zyku-java-rozwi%C4%85zanie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-4-solution.png&#34; alt=&#34;Featured image of post Wyzwanie Java #4: Algorytmy i struktury danych w języku Java - rozwiązanie&#34; /&gt;&lt;p&gt;Czas na wyniki naszego kolejnego wyzwania. Tym razem mieliśmy do rozwiązania dwa zadania, jedno prostsze, drugie trudniejsze, wymagające od nas podstawowej znajomości struktur danych w języku Java i umiejętności pisania algorytmów z ich wykorzystaniem.&lt;/p&gt;&#xA;&lt;h1 id=&#34;zadanie-nr-1&#34;&gt;Zadanie nr 1&#xA;&lt;/h1&gt;&lt;p&gt;Zaczynamy od pierwszego zadania. Naszym celem było dla tablicy wejściowej &lt;em&gt;input&lt;/em&gt; zawierającą liczby typu &lt;em&gt;int&lt;/em&gt; zwrócić tablicę zawierającą ilość elementów ujemnych oraz sumę elementów dodatnich. Jeśli tablica była pusta lub &lt;em&gt;null&lt;/em&gt;, wtedy należało zwrócić pustą tablicę.&lt;/p&gt;&#xA;&lt;p&gt;To zadanie można było rozwiązać na kilka sposobów, jednym z nich jest:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;JavaChallenge4Task1&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; countAndSumElements(&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;{1, 2, 3, 4, 5, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;3, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;2, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;1});&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (result.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; 2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczb ujemnych: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; result&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Suma dodatnich: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; result&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;countAndSumElements&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; input) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (input &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;null&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;||&lt;/span&gt; input.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; 0) &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; element : input) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (element &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; 0) sum &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; element;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (element &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; 0) count&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;{count, sum};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oprócz samej funkcji &lt;em&gt;countAndSumElements&lt;/em&gt; dodaliśmy funkcję &lt;em&gt;main&lt;/em&gt; pozwalającą nam w prosty sposób przetestować działanie naszej funkcji. W Javie można dużo sprawniej testować kod, jednak do tego wrócimy w innym poście.&lt;/p&gt;&#xA;&lt;h1 id=&#34;zadanie-nr-2&#34;&gt;Zadanie nr 2&#xA;&lt;/h1&gt;&lt;p&gt;W kolejnym zadaniu należało stworzyć algorytm sterujący pracą automatu z napojami. Zakładaliśmy, że automat przyjmuje monety 1zł, 2zł i 5zł. Puszka napoju kosztuje 1zł. Na starcie automat nie miał żadnych pieniędzy. Dla wskazanej listy wejściowej monet, należało zwrócić &lt;em&gt;true&lt;/em&gt; lub &lt;em&gt;false&lt;/em&gt; w zależności czy automat będzie w stanie zwrócić resztę. Każda moneta była wrzucana przez innego klienta.&lt;/p&gt;&#xA;&lt;p&gt;Tutaj już trzeba napisać znacznie więcej kodu który realizował konkretny algorytm. Podstawowym problemem który można popełnić w tym zadaniu to zliczanie sumy pieniędzy w automacie, zamiast oddzielnie ilości monet każdego nominału. Niestety gdy ktoś wrzuci 5zł a automat będzie miał tylko w sobie monetę 5zł, to mimo że reszta 4zł jest mniejsza niż suma monet w środku, to nie da się wydać reszty. Z drugiej strony zliczając monety, wystarczy wiedzieć ile było monet 1zł i 2zł, gdyż monety 5zł nigdy nie są zwracane jako reszta, stąd można to pominąć.&lt;/p&gt;&#xA;&lt;p&gt;To zadanie również można było rozwiązać na kilka sposobów, jednym z nich jest:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;JavaChallenge4Task2&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(vendingMachine(List.&lt;span style=&#34;color:#a6e22e&#34;&gt;of&lt;/span&gt;(1, 2, 1, 2, 5))); &lt;span style=&#34;color:#75715e&#34;&gt;// dla pięciu zwracamy dwie dwójki&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(vendingMachine(List.&lt;span style=&#34;color:#a6e22e&#34;&gt;of&lt;/span&gt;(1, 2, 1, 1, 5))); &lt;span style=&#34;color:#75715e&#34;&gt;// dla pięciu zwracamy dwójkę i dwie jedynki&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(vendingMachine(List.&lt;span style=&#34;color:#a6e22e&#34;&gt;of&lt;/span&gt;(1, 1, 1, 1, 5))); &lt;span style=&#34;color:#75715e&#34;&gt;// dla pięciu zwracamy cztery jedynki&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(vendingMachine(List.&lt;span style=&#34;color:#a6e22e&#34;&gt;of&lt;/span&gt;(1, 2, 2, 5, 2))); &lt;span style=&#34;color:#75715e&#34;&gt;// błąd, nie da się wydać przy drugiej dwójce bo w autmacie jest tylko moneta 2 zł&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;vendingMachine&lt;/span&gt;(List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; coins) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; count1Pln &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; count2Pln &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; coin : coins) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (coin &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; 1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                count1Pln&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (coin &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; 2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (count1Pln &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; 1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    count2Pln&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// zostaje 2zł, wydaje 1zł&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    count1Pln&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Jeśli ktoś wrzucił 2zł muszę mieć minimum jedną monetę 1zł by wydać resztę inaczej false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (coin &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; 5) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;// zostaje 5zł, wydajęmy dwie dwójki lub dwójkę i dwie jedynki lub cztery jedynki, dokładnie w tej kolejności&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (count2Pln &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; 2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    count2Pln &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (count2Pln &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; 1 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; count1Pln &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; 2) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    count2Pln&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    count1Pln &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (count1Pln &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; 4) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    count1Pln &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; 4;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// Nie udało mi się wydać żadnej kombinacji...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// ktoś wrzucił nieprawidłową monetę!!!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Wyzwanie Java #4: Algorytmy i struktury danych w języku Java</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%234-algorytmy-i-struktury-danych-w-j%C4%99zyku-java/</link>
            <pubDate>Sat, 05 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%234-algorytmy-i-struktury-danych-w-j%C4%99zyku-java/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-4.png&#34; alt=&#34;Featured image of post Wyzwanie Java #4: Algorytmy i struktury danych w języku Java&#34; /&gt;&lt;p&gt;Programy operują na danych. Mogą one być wczytywane z plików, pochodzić z baz danych, z urządzeń i mierników czy być odbierane po sieci. Bez względu czy będziemy chcieli je tylko wyświetlić użytkownikowi, czy zrobić na nich jakąś zaawansowaną analizę matematyczną, zawsze będziemy potrzebowali w jakiś sposób je przechować w naszym programie. Mechanizm przechowywania w uporządkowany sposób informacji w naszym programie nazywamy &lt;strong&gt;strukturami danych&lt;/strong&gt;. Na tych strukturach będą operować nasze &lt;strong&gt;algorytmy&lt;/strong&gt; i bardzo często od wybranej struktury będzie zależeć wydajność danego algorytmu.&lt;/p&gt;&#xA;&lt;p&gt;Algorytmy i struktury danych to podstawa na której opiera się cała dzisiejsza informatyka, dlatego na każdym kierunku studiów informatycznych jest przynajmniej jeden przedmiot poświęcony tym zagadnieniom. Powstało także mnóstwo książek na temat algorytmów i struktur danych, przy czym za jedną z czołowych pozycji uważana jest monografia &amp;ldquo;Sztuka programowania&amp;rdquo; napisana przez Donalda Knuth&amp;rsquo;a. Sam Bill Gates, założyciel firmy Microsoft, mawiał o tej książce: &amp;ldquo;Jeśli myślisz, że jesteś dobrym programistą (&amp;hellip;) przeczytaj &amp;ldquo;Sztukę programowania&amp;rdquo; (&amp;hellip;). Jeśli będziesz w stanie przeczytać całość, to zdecydowanie prześlij mi swoje CV&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Zakres wiedzy do poznania dogłębnie algorytmów i struktur danych jest tak duży, że w tym poście opowiemy sobie tylko o podstawowych strukturach danych dostępnych w języku Java. Jako uzupełnienie polecam książkę &lt;a class=&#34;link&#34; href=&#34;https://www.packtpub.com/application-development/java-9-data-structures-and-algorithms&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Java 9 Data Structures and Algorithms, Debasish Ray Chawdhuri&lt;/a&gt; lub &lt;a class=&#34;link&#34; href=&#34;https://www.amazon.com/Data-Structures-Algorithms-Java-2nd/dp/0672324539&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Data Structures and Algorithms in Java, 2nd Edition, Robert Lafore&lt;/a&gt; lub jakąkolwiek inną pozycję szeroko traktującą o tych zagadnieniach.&lt;/p&gt;&#xA;&lt;h1 id=&#34;tablice&#34;&gt;Tablice&#xA;&lt;/h1&gt;&lt;p&gt;Podstawową strukturą danych, dostępną w niemal każdym języku programowania są &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;tablice&lt;/strong&gt;&lt;/a&gt;. Tablice przechowują zbiór elementów tego samego typu z zachowaniem kolejności. Dostęp do dowolnego elementu w tablicy realizowany jest przez indeks (typu int) reprezentujący pozycję elementu w tablicy, zaczynając od zera. Oznacza to, że pierwszy element ma pozycję zero, drugi element pozycję jeden, trzeci dwa i tak dalej, aż do ostatniego elementu. Tablice też mają z góry określoną wielkość w momencie ich tworzenia, stąd od początku musimy wiedzieć ile elementów będziemy potrzebować przechować w naszej tablicy.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-4-data-structures-and-algorithms-in-java/objects-tenElementArray.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tablicę deklarujemy podając jej typ, nazwę oraz używając nawiasów kwadratowych &amp;ldquo;[]&amp;rdquo;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; c;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym przykładzie zadeklarowaliśmy trzy tablice typu &lt;em&gt;int&lt;/em&gt;, &lt;em&gt;long&lt;/em&gt; oraz &lt;em&gt;String&lt;/em&gt;. Istnieje także możliwość zadeklarowania tablic tak jak to się robi w języku C/C++, czyli podając nawiasy &amp;ldquo;[]&amp;rdquo; obok nazwy, a nie typu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String c&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Żeby stworzyć tablicę, należy użyć słowa &lt;em&gt;new&lt;/em&gt; poznanego w rozdziale poświęconym programowaniu obiektowemu. Oznacza to, że tablice w języku Java są obiektami.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;100&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; b&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; String&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;5&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podczas tworzenia tablic wymagane jest podanie &lt;em&gt;długości&lt;/em&gt;, czyli liczby elementów, które będzie przechowywać. Podczas tej operacji tworzona jest sama tablica, jednak jest ona pusta w środku.&lt;/p&gt;&#xA;&lt;p&gt;W celu wypełnienia tablicy, trzeba odwołać się do jej poszczególnych pozycji za pomocą indeksu (pamiętajmy o numeracji od zera):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 245;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;34&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;27;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Analogicznie możemy za pomocą indeksu dostać się do zawartości jakiegoś elementu w tablicy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Element nr 0 z tablicy c ma wartość: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do stworzenia i odczytania elementów w tablicy możemy także użyć pętli, np. &lt;em&gt;for&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; 100; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    a&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; 100; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(a&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym przykładzie nasza tablica została wypełniona liczbą taką jak numer indeksu tej liczby, czyli pozycji w tablicy a następnie wszystkie elementy zostały wyświetlone. Podczas inicjalizacji tablicy wszystkie typy proste jak &lt;em&gt;int&lt;/em&gt;, &lt;em&gt;long&lt;/em&gt;, &lt;em&gt;boolean&lt;/em&gt; są inicjalizowane (uzupełniane) ich domyślnymi wartościami, czyli w przypadku &lt;em&gt;int&lt;/em&gt; będzie to zero, zaś boolean wartość false. W przypadku typów złożonych, czyli obiektów, domyślnie dostajemy wartość &lt;strong&gt;null&lt;/strong&gt;, co można zauważyć na poniższym przykładzie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ma&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;4&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kota&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; 5; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wynik programu powyżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ala&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;null&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ma&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;null&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kota&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Niestety, w powyższych przykładach kodu, zawsze musieliśmy wiedzieć jaką dana tablica ma długość, by wskazać to w pętli &lt;em&gt;for&lt;/em&gt;. W zamian można użyć właściwości &lt;strong&gt;lenght&lt;/strong&gt; tablicy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; c.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(c&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gdy korzystamy ze wszystkich elementów tablicy, o wiele wygodniejsze jest użycie nowej wersji pętli &lt;em&gt;form&lt;/em&gt;, tak zwany &lt;strong&gt;foreach&lt;/strong&gt;, czyli &lt;em&gt;dla każdego elementu&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; element : c) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(element);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jedyne co tutaj musimy wskazać to nazwę zmiennej, w której będą umieszczane kolejne elementy tablicy. W naszym przypadku jest to zmienna &amp;ldquo;element&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli z góry wiemy jakie elementy będziemy przechowywać w naszej tablicy, możemy użyć do jej stworzenia uproszczonego zapisu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; names &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Patryk&amp;#34;&lt;/span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zauważmy, że w powyższym przykładzie nie musieliśmy podawać długości tablicy, będzie ona równa liczbie elementów wskazanych przy jej tworzeniu, czyli w naszym przypadku będzie równa trzy.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Dla osób dociekliwych:&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tablice mogą również być wielowymiarowe. Można to rozumieć jako tablicę, która zawiera w sobie inne tablice. Można także tablice dwuwymiarową wyobrażać sobie jako szachownicę, zaś trójwymiarową jako kostkę rubika.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład stworzenia i wyświetlenia tablicy dwuwymiarowej 3x3 liczb typu &lt;em&gt;int&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[][]&lt;/span&gt; tab &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;][&lt;/span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; tab.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; k &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0; k &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; tab&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;; k&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        tab&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;][&lt;/span&gt;k&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; k;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; tab.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; k &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0; k &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; tab&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;length&lt;/span&gt;; k&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;tab[&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;][&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; k &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;] = &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; tab&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;][&lt;/span&gt;k&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;kolekcje&#34;&gt;Kolekcje&#xA;&lt;/h1&gt;&lt;p&gt;Oprócz tablic, w języku Java mamy dostęp do bardziej zaawansowanych struktur danych, zwanych &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/collections/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;kolekcjami&lt;/strong&gt;&lt;/a&gt;. Zbiór kolekcji dzieli sią na &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/collections/interfaces/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;interfejsy&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/collections/implementations/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;implementacje&lt;/a&gt; i &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/collections/algorithms/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;algorytmy&lt;/a&gt;, które możemy wykonywać na kolekcjach. &lt;strong&gt;Interfejs&lt;/strong&gt; opisuje nam daną kolekcję, inaczej kontener, czyli mówi z jakich metod możemy skorzystać w danej kolekcji. &lt;strong&gt;Implementacja&lt;/strong&gt; to klasa, która realizuje dane operacje, jednak na różne sposoby. To trochę tak, jakby w tym samym samochodzie zamontować raz silnik benzynowy, a raz silnik Diesla. Silnik to nasz interfejs, zaś silnik benzynowy i silnik wysokoprężny to już jego dwie implementacje, które robią to samo - napędzają nasz samochód, ale w zupełnie inny sposób.&lt;/p&gt;&#xA;&lt;p&gt;W zależności od wymagań naszego algorytmu, możemy wybrać zupełnie inną kolekcję lub jej implementację, by nasz program był jak najwydajniejszy. Dlatego gruntowna wiedza o algorytmach i strukturach danych bywa tak istotna przy tworzeniu oprogramowania, zwłaszcza obliczeniowego.&lt;/p&gt;&#xA;&lt;p&gt;Poniższy diagram przedstawia w uproszczeniu dostępne interfejsy kolekcji w Javie:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-4-data-structures-and-algorithms-in-java/colls-coreInterfaces.gif&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;list&#34;&gt;List&#xA;&lt;/h2&gt;&lt;p&gt;Kolekcje typu &lt;strong&gt;List&lt;/strong&gt; (lista) są bardzo podobne do tablic. Tak samo jak one są zbiorem przechowującym elementy z zachowaniem ich kolejności. Mogą także przechowywać duplikaty. Jednak w przeciwieństwie do tablic, listy są dynamiczne, to znaczy, że w trakcie działania programu możemy dodawać nowe elementy i nie musimy podczas tworzenia listy podawać jej maksymalnej długości. Dwiema popularnymi &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/collections/implementations/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;implementacjami&lt;/a&gt; &lt;strong&gt;List&lt;/strong&gt; są &lt;strong&gt;ArrayList&lt;/strong&gt; i &lt;strong&gt;LinkedList&lt;/strong&gt;. Pierwsza implementacja opiera się o tablicę (stąd nazwa ArrayList), druga jest tak zwaną listą powiązaną, gdzie elementy są ze sobą połączone niczym wagoniki w kolejce. W większości przypadków lista &lt;em&gt;ArraList&lt;/em&gt; będzie wydajniejsza, stąd jeśli nie wiecie jaką wybrać, jest ona zdecydowanie bezpieczniejszym wyborem. Korzystanie z &lt;em&gt;LinkedList&lt;/em&gt; w nieprawidłowy sposób często bywa źródłem problemów wydajnościowych w programach!&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład stworzenia listy i włożenia do niej elementów:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(5);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(4745);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;87);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Służy do tego metoda &lt;em&gt;add&lt;/em&gt; która dodaje nowy element (u nas liczby 5, 4745 i -87) na końcu listy. Do listy możemy dodać dowolną inną kolekcję za pomocą metody &lt;em&gt;addAll&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(5);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(4745);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;87);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; list2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; LinkedList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list2.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(35);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list2.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;14);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;addAll&lt;/span&gt;(list2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nasze elementy możemy wkładać na dowolną pozycję, nie tylko ostatnie miejsce, wtedy należy podać w metodzie &lt;em&gt;add&lt;/em&gt; lub &lt;em&gt;addAll&lt;/em&gt; pozycję gdzie mają trafić nowe elementy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(1);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; list2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; LinkedList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list2.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(4);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list2.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(0, 5);  &lt;span style=&#34;color:#75715e&#34;&gt;// liczba 5 trafia na początek listy nr 2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;list.&lt;span style=&#34;color:#a6e22e&#34;&gt;addAll&lt;/span&gt;(2, list2); &lt;span style=&#34;color:#75715e&#34;&gt;// do listy 1 dodaję listę 2, od trzeciej pozycji (czyli po kolei: 1,2,5,4,3)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do poszczególnych elementów listy można dostać się, podobnie jak w tablicach, za pomocą pętli &lt;em&gt;foreach&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; element : list) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(element);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub bezpośrednio do dowolnego elementu za pomocą indeksu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(list.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(0));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(list.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(3));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Interfejs &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/10/docs/api/java/util/List.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;em&gt;List&lt;/em&gt;&lt;/a&gt; ma wiele przydatnych metod, w tym takie metody jak:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;add i addAll - dodawanie elementu/-ów&lt;/li&gt;&#xA;&lt;li&gt;clear - usunięcie wszystkich elementów&lt;/li&gt;&#xA;&lt;li&gt;remove i removeAll - usunięcie elementu/-ów&lt;/li&gt;&#xA;&lt;li&gt;isEmpty - sprawdzenie czy lista jest pusta&lt;/li&gt;&#xA;&lt;li&gt;size - sprawdzenie wielkości&lt;/li&gt;&#xA;&lt;li&gt;set - zamiana elementu na inny element&lt;/li&gt;&#xA;&lt;li&gt;sort - posortowanie listy&lt;/li&gt;&#xA;&lt;li&gt;toArray - zamiana na tablicę&lt;/li&gt;&#xA;&lt;li&gt;indexOf​ - zwrócenie pozycji wskazanego elementu&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Większość z powyższych metod pochodzi z interfejsu &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/10/docs/api/java/util/Collection.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Collection&lt;/strong&gt;&lt;/a&gt;, co oznacza, że jest dostępna dla wszystkich kolekcji zgodnie z diagramem przedstawionym wcześniej.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład użycia części z powyższych metod:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; collection1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; ArrayList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; collection2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; LinkedList&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(1);  &lt;span style=&#34;color:#75715e&#34;&gt;// dodawanie elementów&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection2.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(4);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection2.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(0, 5); &lt;span style=&#34;color:#75715e&#34;&gt;// dodanie elementu na początku kolekcji nr. 2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;addAll&lt;/span&gt;(2, collection2); &lt;span style=&#34;color:#75715e&#34;&gt;// łączenie kolekcji, druga kolekcja zacznie się po drugim elemencie&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Elementy: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; element : collection1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(element);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Pozycja liczby 3 to: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;indexOf&lt;/span&gt;(3)); &lt;span style=&#34;color:#75715e&#34;&gt;// pozycje w kolekcjach numerowane są także od zera!!!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(2); &lt;span style=&#34;color:#75715e&#34;&gt;// usunięcie trzeciego elementu&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Pozycja liczby 3 to: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;indexOf&lt;/span&gt;(3));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;set&lt;/span&gt;(0, 10); &lt;span style=&#34;color:#75715e&#34;&gt;// zamieniam pierwszy element na 10&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Pierwszy element kolekcji: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;get&lt;/span&gt;(0));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;clear&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba elementów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;set&#34;&gt;Set&#xA;&lt;/h2&gt;&lt;p&gt;Kolejną i bardzo często używaną w praktyce kolekcją jest &lt;strong&gt;Set&lt;/strong&gt; (zbiór). W przeciwieństwie do list, zbiory nie pozwalają na dodawanie duplikatów.&lt;/p&gt;&#xA;&lt;p&gt;Wyróżniamy aż trzy podstawowe &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/collections/implementations/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;implementacje&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HashSet - najpopularniejszy i zarazem najwydajniejszy, jednak nie zachowuje żadnego porządku (kolejności), co oznacza, że elementy będą zwracane w losowej kolejności, jest oparty o &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Tablica_mieszaj%C4%85ca&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tablice mieszające&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;TreeSet - wolniejszy od HashSet, lecz zachowujący kolejność elementów ze względu na ich wartość (sortowanie), oparty na algorytmie &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Drzewo_czerwono-czarne&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;drzewa czerwono czarnego&lt;/a&gt;, od którego pochodzi jego przedrostek &amp;ldquo;tree&amp;rdquo;&lt;/li&gt;&#xA;&lt;li&gt;LinkedHashSet - podobnie do HashSet bazuje na tablicach mieszających, jednak z tą różnicą, że dzięki zastosowaniu dodatkowo listy powiązanej (linked list), zachowuje kolejność w jakiej elementy są dodawane do kolekcji&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Poniżej przykładowy kod z użyciem dwóch implementacji interfejsu &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/10/docs/api/java/util/Set.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;em&gt;Set&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Set&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; collection1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; TreeSet&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Set&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; collection2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; HashSet&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(1);  &lt;span style=&#34;color:#75715e&#34;&gt;// dodawanie elementów&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(3);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection2.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(5);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection2.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(4);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;addAll&lt;/span&gt;( collection2); &lt;span style=&#34;color:#75715e&#34;&gt;// łączenie kolekcji&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Elementy: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; element : collection1) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(element);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba elementów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(2); &lt;span style=&#34;color:#75715e&#34;&gt;// usunięcie liczby dwa!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba elementów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;clear&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba elementów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;map&#34;&gt;Map&#xA;&lt;/h2&gt;&lt;p&gt;Trzecią i zarazem niezwykle popularną kolekcją stosowaną przez programistów języka Java jest &lt;strong&gt;Map&lt;/strong&gt; (mapa lub słownik). Kolekcja ta służy do przechowywania par klucz - wartość. Dlatego na diagramie kolekcji, nie są zależne od interfejsu &lt;em&gt;Collection&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Mamy dostępne trzy podstawowe implementacje interfejsu &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/10/docs/api/java/util/Map.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;em&gt;Map&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HashMap - analogiczna do HashSet&lt;/li&gt;&#xA;&lt;li&gt;TreeMap - analogiczna do TreeSet&lt;/li&gt;&#xA;&lt;li&gt;LinkedHashMap - analogiczna do LinkedHashSet&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Jak widać słowniki (map) są zbudowane i zachowują się jak zbiory (set), z tą różnicą, że operują na elementach będących parami.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład użycia dwóch implementacji &lt;em&gt;Map&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Map&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer, String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; collection1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; TreeMap&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Map&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer, String&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; collection2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; HashMap&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(1, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;jeden&amp;#34;&lt;/span&gt;);  &lt;span style=&#34;color:#75715e&#34;&gt;// dodawanie elementów&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(2, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;dwa&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(3, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;trzy&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection2.&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(5, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pięć&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection2.&lt;span style=&#34;color:#a6e22e&#34;&gt;put&lt;/span&gt;(4, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;cztery&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;putAll&lt;/span&gt;(collection2); &lt;span style=&#34;color:#75715e&#34;&gt;// łączenie kolekcji&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Klucze: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; key : collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;keySet&lt;/span&gt;()) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(key);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Wartości: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; value : collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;values&lt;/span&gt;()) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(value);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Pary: &amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; entry : collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;entrySet&lt;/span&gt;()) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(entry.&lt;span style=&#34;color:#a6e22e&#34;&gt;getKey&lt;/span&gt;() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; -&amp;gt; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; entry.&lt;span style=&#34;color:#a6e22e&#34;&gt;getValue&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba elementów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;remove&lt;/span&gt;(2); &lt;span style=&#34;color:#75715e&#34;&gt;// usunięcie pary pod kluczem dwa!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba elementów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;clear&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba elementów: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; collection1.&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W przeciwieństwie do poprzednich kolekcji, dodawanie nowych elementów następuje dzięki metodom &lt;em&gt;put&lt;/em&gt; i &lt;em&gt;putAll&lt;/em&gt;, a nie &lt;em&gt;add&lt;/em&gt; i &lt;em&gt;addAll&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Znacząco też zmieniła się postać pętli &lt;em&gt;foreach&lt;/em&gt;. W przypadku map, możemy iterować się po zbiorze kluczy (&lt;em&gt;keySet&lt;/em&gt;), zbiorze wartości (&lt;em&gt;values&lt;/em&gt;) oraz po zbiorze par (&lt;em&gt;entrySet&lt;/em&gt;), gdzie każda para składa się z klucza i wartości.&lt;/p&gt;&#xA;&lt;p&gt;Przedstawiona wiedza o tablicach i kolekcjach to niestety tylko wierzchołek góry lodowej, zwanej &lt;em&gt;algorytmami i strukturami danych&lt;/em&gt;, dlatego zachęcamy wszystkich do rozszerzenia tej wiedzy o stosowne lektury. Java od wersji ósmej ma także dostępny bardzo rozbudowany mechanizm operacji na kolekcjach zwany strumieniami (streams), ale jemu poświęcimy oddzielne wyzwanie.&lt;/p&gt;&#xA;&lt;h1 id=&#34;wyzwanie&#34;&gt;Wyzwanie&#xA;&lt;/h1&gt;&lt;p&gt;Czas na nasze wyzwanie. Tym razem rozbijemy je na dwie części, pierwszą z zastosowaniem samych &lt;em&gt;struktur danych&lt;/em&gt; i drugą, znacznie trudniejszą, gdzie trzeba będzie wymyślić &lt;em&gt;algorytm&lt;/em&gt; operujący na tych strukturach.&lt;/p&gt;&#xA;&lt;h2 id=&#34;zadanie-nr-1&#34;&gt;Zadanie nr 1&#xA;&lt;/h2&gt;&lt;p&gt;Dla tablicy wejściowej &lt;em&gt;input&lt;/em&gt; zawierającą liczby typu &lt;em&gt;int&lt;/em&gt; zwrócić tablicę zawierającą ilość elementów ujemnych oraz sumę elementów dodatnich. Jeśli tablica będzie pusta lub &lt;em&gt;null&lt;/em&gt;, wtedy należy zwrócić pustą tablicę.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;countAndSumElements&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; input) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// TODO tutaj kod&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Przykład:&#xA;Dla wejścia: input int[] {1, 2, 3, 4, 5, -3, -2, -1} program powinien zwrócić: int[] {3, 15}, czyli 3 liczby ujemne i suma liczb dodatnich równa 15.&lt;/p&gt;&#xA;&lt;h2 id=&#34;zadanie-nr-2&#34;&gt;Zadanie nr 2&#xA;&lt;/h2&gt;&lt;p&gt;Należy stworzyć algorytm sterujący pracą automatu z napojami. Zakładamy, że automat przyjmuje monety 1zł, 2zł i 5zł. Puszka napoju kosztuje 1zł. Na starcie automat nie ma żadnych pieniędzy.&lt;/p&gt;&#xA;&lt;p&gt;Dla wskazanej listy wejściowej monet, należy zwrócić &lt;em&gt;true&lt;/em&gt; lub &lt;em&gt;false&lt;/em&gt; w zależności czy automat będzie w stanie zwrócić resztę. Każda moneta jest wrzucana przez innego klienta.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;vendingMachine&lt;/span&gt;(List&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Integer&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; coins) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// TODO tutaj kod&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Przykład:&#xA;Dla monet: List&lt;!-- raw HTML omitted --&gt; coins = List.of(1, 2, 1, 1, 5) program zwróci wartość &lt;em&gt;true&lt;/em&gt;, zaś dla monet:  List&lt;!-- raw HTML omitted --&gt; coins = List.of(1, 2, 2, 5, 2) program powinien zwrócić wartość &lt;em&gt;false&lt;/em&gt;, gdyż już dla drugiej monety 2zł nie będzie możliwości zwrócenia reszty kupującemu.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #3: Programowanie obiektowe - rozwiązanie</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%233-programowanie-obiektowe-rozwi%C4%85zanie/</link>
            <pubDate>Fri, 04 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%233-programowanie-obiektowe-rozwi%C4%85zanie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-3-solution.png&#34; alt=&#34;Featured image of post Wyzwanie Java #3: Programowanie obiektowe - rozwiązanie&#34; /&gt;&lt;p&gt;Czas na rozwiązanie naszego kolejnego wyzwania. Tym razem podnieśliśmy poprzeczkę znacznie wyżej, dlatego jeśli mieliście jakieś problemy, zachęcamy potraktowanie tego rozwiązania jako wskazówki i spróbowania samodzielnego rozwiązania zadania.&lt;/p&gt;&#xA;&lt;p&gt;W trzecim wyzwaniu poprosiliśmy Was o stworzenie kalkulatora, który będzie pracował na własnym typie (klasie) &lt;strong&gt;Fraction&lt;/strong&gt; reprezentującym ułamek. Problem jaki mogliśmy spotkać w poprzednim rozwiązaniu, to operacje typu 2 / 3 były rzutowane na typ &lt;em&gt;double&lt;/em&gt; i przez to zaokrąglane do postaci 0.66(6), co będzie skutkować błędami obliczeń.&lt;/p&gt;&#xA;&lt;p&gt;By wyjaśnić lepiej zadanie, a tym samym rozwiać wątpliwości związane z programowaniem obiektowym, zadanie będzie rozwiązane krok po kroku.&lt;/p&gt;&#xA;&lt;h1 id=&#34;rozwiązanie&#34;&gt;Rozwiązanie&#xA;&lt;/h1&gt;&lt;p&gt;Zaczynamy od stworzenia klasy &lt;em&gt;Fraction&lt;/em&gt; z trzema polami wymienionymi w zadaniu, czyli licznika, mianownika i części całkowitej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Żeby móc stworzyć ten obiekt wraz z polami, dodamy konstruktor, czyli specjalną &amp;ldquo;metodę&amp;rdquo; tworzącą obiekty:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Na razie idzie prosto. Jednak klasa jeszcze nic nie potrafi, pola są prywatne (hermetyzacja), więc tworząc taką klasę nie mamy nawet do nich dostępu&amp;hellip; Dlatego stwórzmy sobie dodatkowo funkcję która zwraca nam ułamek w postaci dziesiętnej, czyli po prostu typ &lt;strong&gt;double&lt;/strong&gt;. Dostajemy zatem taki kod:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsDecimal&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;) numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym kodzie trudność może sprawić konieczność &lt;strong&gt;rzutowania&lt;/strong&gt;, czyli wymuszenia by liczba &lt;em&gt;numerator&lt;/em&gt; będąca typem &lt;em&gt;int&lt;/em&gt; była jednak potraktowana jako &lt;em&gt;double&lt;/em&gt;. Gdybyśmy tego nie zrobili, wynik działania zostałby &amp;ldquo;obcięty&amp;rdquo; do części całkowitej, w końcu typ &lt;em&gt;int&lt;/em&gt; jest typem całkowitym. Sam wynik byłby zwrócony jako &lt;em&gt;double&lt;/em&gt;, tak robi to nasza metoda, jednak wtedy będzie już &amp;ldquo;za późno&amp;rdquo;, końcówka zostanie ucięta wcześniej (zgodnie z kolejnością wykonywania obliczeń).&lt;/p&gt;&#xA;&lt;p&gt;Teraz możemy pójść dalej i zaimplementować podstawowe operacje matematyczne na &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/U%C5%82amek&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ułamkach&lt;/a&gt;, czyli dodawanie, odejmowanie, mnożenie i dzielenie.&lt;/p&gt;&#xA;&lt;p&gt;Nasza klasa zaczyna wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (numerator &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; denominator) { &lt;span style=&#34;color:#75715e&#34;&gt;// gdy licznik i mianownik równe, wynik to liczba 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (numerator &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; denominator) { &lt;span style=&#34;color:#75715e&#34;&gt;// ułamek niewłaściwy, wyciągamy część całkowitą&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; { &lt;span style=&#34;color:#75715e&#34;&gt;// ułamek właściwy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsDecimal&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;) numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d1, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;subtract&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d1, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;multiply&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; n2, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;divide&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; n2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dla ułatwienia czytelności działań matematycznych, zostały użyte dodatkowe zmienne &lt;em&gt;n1&lt;/em&gt;, &lt;em&gt;d1&lt;/em&gt;, &lt;em&gt;n2&lt;/em&gt;, &lt;em&gt;d2&lt;/em&gt;. Należy zauważyć, że obok czterech metod odpowiadających za podstawowe operacje matematyczne został dodany nowy konstruktor który przyjmuje jedynie licznik i mianownik i w razie potrzeby wyciąga część całkowitą gdy ułamek jest niewłaściwy, tworzymy wtedy tak zwaną liczbę mieszaną.&lt;/p&gt;&#xA;&lt;p&gt;Jesteśmy już praktycznie &amp;ldquo;w domu&amp;rdquo;. Taka postać klasy &lt;em&gt;Fraction&lt;/em&gt; spełnia nasze podstawowe wymagania, czyli możliwość pracy na ułamkach. Jednak pokusimy się tutaj o dodanie czegoś bardziej zaawansowanego, mianowicie &lt;em&gt;skracanie ułamków&lt;/em&gt;. Powyższy kod potrafi nam wyprodukować wynik w postaci 10/8, więc warto by było rozszerzyć klasę o algorytm skracający ułamek do postaci 5/4. By skrócić ułamek, potrzebujemy wyliczyć największy wspólny dzielnik (NWD) (ang. GCD - Greatest Common Divisor). Tutaj jednak zaczynają się schody, bo nie jest to wcale tak trywialne zadanie, by go obliczyć. Można oczywiście poszukiwać NWD iterując się w pętli po wszystkich możliwych liczbach z zakresu od zera do mniejszej z nich, dzielić obydwie i sprawdzać czy reszta z dzielenia dla obydwu jest zerowa, ale nie będzie to zbyt optymalne. Euklides odkrył, że największy wspólny dzielnik dwóch liczb, dzieli także ich różnicę, dlatego wystarczy, że dopóki dwie liczby są identyczne, odejmujemy od większej mniejszą. Gdy liczby staną się równe, dowolna z nich to nasz NWD.&lt;/p&gt;&#xA;&lt;p&gt;Nasza klasa po przeróbce może wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// UWAGA, ten kod nie zabezpiecza nas przed mianownikiem równym zero!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; gcd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gcd(numerator, denominator);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// skracanie ułamka&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        numerator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; gcd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        denominator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; gcd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// UWAGA, ten kod nie zabezpiecza nas przed mianownikiem równym zero!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; gcd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gcd(numerator, denominator);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// skracanie ułamka&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        numerator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; gcd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        denominator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; gcd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (numerator &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; denominator) { &lt;span style=&#34;color:#75715e&#34;&gt;// gdy licznik i mianownik równe, wynik to liczba 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (numerator &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; denominator) { &lt;span style=&#34;color:#75715e&#34;&gt;// ułamek niewłaściwy, wyciągamy część całkowitą&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; { &lt;span style=&#34;color:#75715e&#34;&gt;// ułamek właściwy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsDecimal&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;) numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d1, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;subtract&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d1, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;multiply&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; n2, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;divide&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; n2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Największy wspólny dzielnik&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gcd&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; b) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (a &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; 0) a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;a; &lt;span style=&#34;color:#75715e&#34;&gt;// zmieniamy na wartości dodatnie&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (b &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; 0) b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (a &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; b)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (a &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; b) a &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Skracanie zostało użyte w obydwu konstruktorach.&lt;/p&gt;&#xA;&lt;p&gt;Powyższą modyfikacja wymagała większej wiedzy matematycznej, dlatego potraktujmy to jako wersję z gwiazdką.&lt;/p&gt;&#xA;&lt;p&gt;To wszystko co należało wykonać w klasie &lt;em&gt;Fraction&lt;/em&gt;. Zostało już jedynie napisanie samego kalkulatora, czyli klasy z metodą &lt;em&gt;main&lt;/em&gt;. Ten kod stworzyliśmy już w poprzednim wyzwaniu, teraz jedynie go zmodyfikujemy o użycie klasy &lt;em&gt;Fraction&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.calc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.math.Fraction;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FractionCalculator&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Proszę podaj w oddzielnych linijkach jakąś liczbę, operację matematyczną +,-,*,/ a następnie kolejną liczbę:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String runAgain;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; denominator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(numerator, denominator);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; operation &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            numerator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;next&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            denominator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextInt&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(numerator, denominator);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Fraction result;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x.&lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x.&lt;span style=&#34;color:#a6e22e&#34;&gt;subtract&lt;/span&gt;(y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x.&lt;span style=&#34;color:#a6e22e&#34;&gt;multiply&lt;/span&gt;(y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x.&lt;span style=&#34;color:#a6e22e&#34;&gt;divide&lt;/span&gt;(y);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nieznana operacja!&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(0);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Twój wynik to: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; result.&lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsString&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Chcesz wykonać kolejne działanie? Wpisz literę t lub n.&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            runAgain &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (runAgain.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym kodzie zostało przyjęte, że użytkownik podaje liczby w postaci: licznik / mianownik. Aby ułatwić sobie napisanie powyższego kodu, dodaliśmy dodatkowo nowy konstruktor przyjmujący tylko część całkowitą oraz metodę &lt;em&gt;getFractionAsString&lt;/em&gt; zwracającą ułamek jako String do wyświetlenia.&lt;/p&gt;&#xA;&lt;p&gt;Ostateczna wersja klasy &lt;em&gt;Fraction&lt;/em&gt; wygląda tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.math;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; value) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; value;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        numerator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        denominator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fractionInteger, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// UWAGA, ten kod nie zabezpiecza nas przed mianownikiem równym zero!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; gcd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gcd(numerator, denominator);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// skracanie ułamka&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        numerator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; gcd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        denominator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; gcd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fractionInteger;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Fraction&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; numerator, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; denominator) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// UWAGA, ten kod nie zabezpiecza nas przed mianownikiem równym zero!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; gcd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gcd(numerator, denominator);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// skracanie ułamka&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        numerator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; gcd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        denominator &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; gcd;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (numerator &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; denominator) { &lt;span style=&#34;color:#75715e&#34;&gt;// gdy licznik i mianownik równe, wynik to liczba 1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (numerator &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; denominator) { &lt;span style=&#34;color:#75715e&#34;&gt;// ułamek niewłaściwy, wyciągamy część całkowitą&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; { &lt;span style=&#34;color:#75715e&#34;&gt;// ułamek właściwy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; numerator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsDecimal&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt;) numerator &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String &lt;span style=&#34;color:#a6e22e&#34;&gt;getFractionAsString&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (denominator &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; 1) { &lt;span style=&#34;color:#75715e&#34;&gt;// jeśli mianownik równy 1, to w naszej klasie powinniśmy mieć liczbę całkowitą&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; String.&lt;span style=&#34;color:#a6e22e&#34;&gt;valueOf&lt;/span&gt;(fractionInteger);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; 0) { &lt;span style=&#34;color:#75715e&#34;&gt;// jeśli nie ma części całkowitej zwracamy sam ułamek&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; { &lt;span style=&#34;color:#75715e&#34;&gt;// jeśli jest część całkowita to zwracamy jako liczbę mieszaną&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; fractionInteger &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; numerator &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; denominator;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;add&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d1, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;subtract&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d1, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;multiply&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; n2, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; Fraction &lt;span style=&#34;color:#a6e22e&#34;&gt;divide&lt;/span&gt;(Fraction fraction) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;numerator&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;fractionInteger&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fraction.&lt;span style=&#34;color:#a6e22e&#34;&gt;denominator&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Fraction(n1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; d2, d1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; n2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Największy wspólny dzielnik&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;gcd&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; b) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (a &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; 0) a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;a; &lt;span style=&#34;color:#75715e&#34;&gt;// zmieniamy na wartości dodatnie&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (b &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; 0) b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (a &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; b)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (a &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; b) a &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;zaś samo wykonanie programu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Proszę podaj w oddzielnych linijkach jakąś liczbę, operację matematyczną +,-,*,/ a następnie kolejną liczbę:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; / &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt; / &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Twój wynik to: &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; 1/4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Chcesz wykonać kolejne działanie? Wpisz literę t lub n.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;t&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt; / &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt; / &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Twój wynik to: &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; 1/8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Chcesz wykonać kolejne działanie? Wpisz literę t lub n.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Process finished with exit code &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;czy-można-to-zrobić-jeszcze-lepiej&#34;&gt;Czy można to zrobić jeszcze lepiej?&#xA;&lt;/h1&gt;&lt;p&gt;Podobnie jak poprzednio, warto by było w przyszłości rozszerzyć ten program o lepszą obsługę błędów w przypadku sytuacji wyjątkowych, takich jak np. dzielenie przez zero. O walidacji i obsłudze błędów w Javie wspomnimy jednak w innym wyzwaniu, dlatego teraz jeszcze to pomijamy. Jeśli byście chcieli zobaczyć, jak wygląda taka klasa po uwzględnieniu wszystkich sytuacji wyjątkowych z zastosowaniem bardziej zaawansowanych algorytmów niż powyższe, polecam spojrzeć na &lt;a class=&#34;link&#34; href=&#34;https://github.com/apache/commons-math/blob/master/src/main/java/org/apache/commons/math4/fraction/Fraction.java&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;kod źródłowy&lt;/a&gt; klasy &lt;em&gt;Fraction&lt;/em&gt; z otwarto źródłowej biblioteki &lt;a class=&#34;link&#34; href=&#34;http://commons.apache.org/proper/commons-math/userguide/fraction.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Apache Commons&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Java od środka, czyli jak to wszystko działa?</title>
            <link>https://bigdatapassion.pl/blog/java-od-%C5%9Brodka-czyli-jak-to-wszystko-dzia%C5%82a/</link>
            <pubDate>Thu, 03 May 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/java-od-%C5%9Brodka-czyli-jak-to-wszystko-dzia%C5%82a/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/java/gears.jpg&#34; alt=&#34;Featured image of post Java od środka, czyli jak to wszystko działa?&#34; /&gt;&lt;p&gt;W poprzednich wyzwaniach dowiedzieliśmy się, że nasze programy pisane w języku Java działają dzięki wirtualnej maszynie Java. Dowiedzieliśmy się także, że na wirtualnej maszynie Java można uruchamiać programy napisane w innych językach programowania jak np. Scala, Groovy czy Kotlin. Dzisiejszy post będzie poświęcony temu, jak to wszystko działa. Nie jest to wiedza niezbędna, by zacząć swoją przygodę z programowaniem, wręcz przeciwnie, wielu programistów potrafi polec na rozmowie kwalifikacyjnej o pytania dotyczące maszyny wirtualnej, jednak do biegłego posługiwania się językami ze świata maszyny wirtualnej Java, warto dowiedzieć się co mamy pod przysłowiową maską.&lt;/p&gt;&#xA;&lt;h1 id=&#34;maszyna-wirtualna-java&#34;&gt;Maszyna wirtualna Java&#xA;&lt;/h1&gt;&lt;p&gt;Wszystko zaczyna się od Wirtualnej Maszyny Java. To ona stoi za wielkim sukcesem całej platformy Java. To także ona jako pierwsza musi być zainstalowana w naszym komputerze by móc uruchomić jakiekolwiek aplikacje napisane w języku Java.&lt;/p&gt;&#xA;&lt;p&gt;W praktyce JVM jest to jakiś program instalowany tak jak inne programy w naszym komputerze. Oznacza to, że wirtualna maszyna pracuje w danym systemie operacyjnym i musi być z nim zgodna, stąd na stronie Oracle można ją ściągnąć dla takich systemów jak Windows, Linux, macOS czy Solaris. Także Android (&lt;a class=&#34;link&#34; href=&#34;https://source.android.com/devices/tech/dalvik/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Dalvik&lt;/a&gt;) i inne systemy mobilne lub &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/K_Virtual_Machine&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;wbudowane&lt;/a&gt; mają swoją wersję maszyny wirtualnej. Możemy nawet uruchamiać programy w Javie na &lt;a class=&#34;link&#34; href=&#34;http://www.lejos.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Lego Mindstorms&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jest także wiele implementacji JVM. Najpopularniejsza jest oczywiście wirtualna maszyna tworzona przez firmę Oracle, zaś wcześniej przez firmę Sun, tak zwana Oracle &lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;HotSpot&lt;/a&gt;. Firma Oracle przejęła też projekt innej maszyny wirtualnej produkowanej przez BEA Systems, czyli &lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;JRockit&lt;/a&gt;. Projekt ten został jednak zamknięty, zaś część jego kodu została przeniesiona do maszyny wirtualnej Oracle oraz do projektu &lt;a class=&#34;link&#34; href=&#34;http://openjdk.java.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OpenJDK&lt;/a&gt;. Jest to &lt;a class=&#34;link&#34; href=&#34;http://hg.openjdk.java.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;otwarto źródłowa&lt;/a&gt; implementacja maszyny wirtualnej zainicjowana jeszcze przez firmę Sun. Jest to domyślna implementacja stosowana w systemach Linux oraz obrazach Docker&amp;rsquo;a czy innych systemów konteneryzacji. Projekt OpenJDK jest także prowadzony przez firmę Oracle przy współpracy z innymi firmami i programistami z &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/OpenJDK&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;całego świata&lt;/a&gt;. Tak naprawdę, obecna wersja maszyny wirtualnej Java dostępnej na &lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/java/javase/downloads/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;stronie&lt;/a&gt; jest hybrydą dwóch starszych wersji przejętych przez firmę Oracle (HotSpot i JRockit) oraz w dużej mierze bazuje na OpenJDK. Plan firmy Oracle, zapowiedziany na &lt;a class=&#34;link&#34; href=&#34;https://www.oracle.com/java/java9-screencasts.html?bcid=5582439790001&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;filmie&lt;/a&gt;, jest taki, by OpenJDK była wersją krótkoterminową, przeznaczoną dla zwykłych użytkowników, developerów, zaś Oracle JDK ma być wersję długoterminową, dla firm i instytucji, którym zależy na stabilności przed długi czas oraz ma zawierać dodatkowe, komercyjne funkcjonalności. Zmienił się także sposób wprowadzania nowych zmian, od wersji 9tej, nowa wersja maszyny wirtualnej i języka Java ma być wydawana co pół roku, zaś co 3 lata ma być wydawana wersja &lt;strong&gt;LTS&lt;/strong&gt; czyli &lt;strong&gt;Long Term Support&lt;/strong&gt;, przeznaczona właśnie dla firm wymagających dłuższego utrzymania.&lt;/p&gt;&#xA;&lt;p&gt;Na rynku dostępnych jest także sporo implementacji innych firm. IBM oraz fundacja Eclipse stoi za rozwojem maszyny wirtualnej &lt;a class=&#34;link&#34; href=&#34;https://www.ibm.com/support/knowledgecenter/en/SSYKE2_7.0.0/com.ibm.java.win.70.doc/user/java_jvm.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;IBM J9&lt;/a&gt;. Firma Azul System rozwija swoją otwarto źródłową wersję maszyny wirtualnej &lt;a class=&#34;link&#34; href=&#34;https://www.azul.com/products/zulu-and-zulu-enterprise/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Zulu&lt;/a&gt; opartej o OpenJDK oraz komercyjną wersję &lt;a class=&#34;link&#34; href=&#34;https://www.azul.com/products/zing/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Zing&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jedną z nowości w świecie Java są prace nad nową wersją maszyny wirtualnej zwanej &lt;a class=&#34;link&#34; href=&#34;https://blogs.oracle.com/developers/announcing-graalvm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;GraalVM&lt;/strong&gt;&lt;/a&gt;. Celem projektu jest stworzenie jeszcze wydajniejszej wersji JVM wspierającej więcej języków programowania, jak JavaScript (także Node.js), C, C++, Rust, Ruby, R czy Python. &lt;em&gt;GrallVM&lt;/em&gt; ma się stać także częścią baz danych &lt;em&gt;MySQL&lt;/em&gt; oraz &lt;a class=&#34;link&#34; href=&#34;https://oracle.github.io/oracle-db-mle/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;em&gt;Oracle&lt;/em&gt;&lt;/a&gt;. W przeciwieństwie do innych maszyn wirtualnych, &lt;strong&gt;GraalVM&lt;/strong&gt; jest napisany głównie w języku &lt;a class=&#34;link&#34; href=&#34;https://github.com/oracle/graal&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Java&lt;/a&gt; (97.3%).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/java-how-it-works/announcing_graalvm_version7.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Więcej innych implementacji wirtualnej maszyny możecie znaleźć na &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/List_of_Java_virtual_machines#Proprietary_implementations&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tej&lt;/a&gt; oraz &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;tej&lt;/a&gt; stronie Wikipedii.&lt;/p&gt;&#xA;&lt;p&gt;Każda licząca się maszyna wirtualna musi spełniać &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/specs/jvms/se10/html/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;specyfikację&lt;/a&gt; oraz przejść &lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Technology_Compatibility_Kit&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Java Technology Compatibility Kit, TCK&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Wirtualna maszyna Java jest udostępniana w dwóch wersjach, &lt;em&gt;Java Runtime Environment (JRE)&lt;/em&gt; zawierająca podstawową instalację maszyny wirtualnej wraz z dodatkowymi bibliotekami i komponentami, służącą przede wszystkim do uruchamiania programów oraz &lt;em&gt;Java Development Kit (JDK)&lt;/em&gt; zawierająca wszystko co ma JRE plus dodatkowe narzędzia dla programistów. Poniżej diagram przedstawiający różnice między obydwiema wersjami dostępny na &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/8/docs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;stronie&lt;/a&gt; Oracle.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/java-how-it-works/jdk-jre-diagram.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;od-kodu-do-programu-czyli-proces-kompilacji&#34;&gt;Od kodu do programu, czyli proces kompilacji&#xA;&lt;/h1&gt;&lt;p&gt;Java jest językiem &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/J%C4%99zyk_kompilowany&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;kompilowanym&lt;/a&gt;, to znaczy, że zanim uruchomimy nasz program, cały nasz kod będzie musiał zostać poddany procesowi kompilacji do postaci zrozumiałej dla komputera. W przypadku Javy, nasze programy będą uruchamiane przez maszynę wirtualną Java, więc narzędzie zwane &lt;strong&gt;kompilatorem&lt;/strong&gt; będzie tłumaczyć nasz kod Java do postaci kodu maszynowego zrozumiałego dla JVM. Dlatego bez względu na to, jakiego języka programowania użyjemy, Java, Scala, Kotlin, Groovy, etc, nasz kod zawsze będzie tłumaczony do kodu maszyny wirtualnej, zwanego &lt;strong&gt;bytecode&lt;/strong&gt;. Dopiero sama maszyna wirtualna tłumaczy ten kod dalej do postaci zrozumiałej przez system operacyjny naszego komputera.&lt;/p&gt;&#xA;&lt;p&gt;Jako programiści będziemy pisać nasz kod Java w plikach &lt;strong&gt;.java&lt;/strong&gt;, zaś kompilator będzie je tłumaczył na bytecode i umieszczał w plikach &lt;strong&gt;.class&lt;/strong&gt;. W przypadku środowiska IntelliJ IDEA, pliki typu &lt;em&gt;class&lt;/em&gt; znajdują się domyślnie w katalogu &lt;em&gt;out&lt;/em&gt;. Po kliknięciu takiego pliku *&lt;em&gt;.class&lt;/em&gt; w środowisku IntelliJ IDEA, możemy zobaczyć kod w języku Java. Dzieje się tak dzięki &lt;strong&gt;dekompilacji&lt;/strong&gt;, czyli procesowi odwrotnemu do &lt;em&gt;kompilacji&lt;/em&gt;, polegającemu właśnie na uzyskaniu kodu źródłowego z plików *&lt;em&gt;.class&lt;/em&gt;. Oczywiście nie będzie to dokładnie nasz kod, tylko wygenerowany kod Java pasujący do zawartości pliku *&lt;em&gt;.class&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Kompilator jest dla programistów bardzo przydatnym narzędziem. Już na etapie tłumaczenia naszego kodu na język maszyny wirtualnej jest w stanie wyłapać wszystkie błędy składni (dostajemy wtedy tak zwany błąd kompilacji) oraz ostrzega nas przed wieloma potencjalnymi błędami. Drugą zaletą języków kompilowanych jest możliwość &amp;ldquo;zrzucenia&amp;rdquo; części własnej pracy na kompilator, który może za nas wykonać część pracy, by skrócić nasz czas. Jednym z przykładów jest tutaj choćby słowo &lt;strong&gt;var&lt;/strong&gt;, gdzie to kompilator domyśla się typu zmiennej.&lt;/p&gt;&#xA;&lt;p&gt;Środowiska programistyczne proces kompilacji wykonują za nas. W praktyce, do budowania większych projektów używa się odpowiednich narzędzi jak &lt;a class=&#34;link&#34; href=&#34;https://maven.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Maven&lt;/strong&gt;&lt;/a&gt; czy &lt;a class=&#34;link&#34; href=&#34;https://gradle.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Gradle&lt;/strong&gt;&lt;/a&gt; (wcześniej popularny był &lt;a class=&#34;link&#34; href=&#34;http://ant.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Ant&lt;/strong&gt;&lt;/a&gt;), które także wykonują tą pracę za nas. Jednak nic nie stoi na przeszkodzie byśmy sami skompilowali nasz kod. Wraz z JDK dostajemy narzędzie &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;javac&lt;/strong&gt;&lt;/a&gt;, które jest właśnie kompilatorem języka Java. Co ciekawe, jest ono także stworzone w oparciu o język Java.&lt;/p&gt;&#xA;&lt;p&gt;Załóżmy że mamy taką klasę Java:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.myclasses;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;(String forename, String surname, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;forename&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;surname&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nazywam się &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; forename &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; surname &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;. Mam &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; age &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; lat.&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Znajduje się ona w pliku &lt;em&gt;Person.java&lt;/em&gt;. Żeby ją &lt;em&gt;skompilować&lt;/em&gt; wystarczy w konsoli wpisać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;javac Person.java&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po wykonaniu powyższego polecenia, w tym samym katalogu powstanie plik &lt;em&gt;Person.class&lt;/em&gt;. Zawartość nowo otrzymanego pliku nie jest zbyt czytelna dla człowieka, ale gdybyśmy chcieli zajrzeć do środka możemy użyć programu &lt;strong&gt;javap&lt;/strong&gt;, który pozwala nam na rozłożenie pliku *&lt;em&gt;.class&lt;/em&gt; na czynniki pierwsze (ang. disassemble).&#xA;Domyślnie program &lt;em&gt;javap&lt;/em&gt; wykonany bez żadnych parametrów pokazuje nam pakiet, pola public i protected oraz metody:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ javap Person.class &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compiled from &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Person.java&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;public class pl.kodolamacz.myclasses.Person &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public java.lang.String forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public java.lang.String surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public int age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public pl.kodolamacz.myclasses.Person&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public pl.kodolamacz.myclasses.Person&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;java.lang.String, java.lang.String, int&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public void introduceYourself&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public int growOld&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;int&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jednak gdy dodamy flagę &lt;em&gt;-c&lt;/em&gt;, wtedy program wyświetli nam instrukcje kodu maszynowego Java (bytecode) zgodnie ze &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/specs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;specyfikacją&lt;/a&gt; języka:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ javap -c Person.class &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compiled from &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Person.java&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;public class pl.kodolamacz.myclasses.Person &lt;span style=&#34;color:#f92672&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public java.lang.String forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public java.lang.String surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public int age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public pl.kodolamacz.myclasses.Person&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Code:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       0: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       1: invokespecial &lt;span style=&#34;color:#75715e&#34;&gt;#1                  // Method java/lang/Object.&amp;#34;&amp;lt;init&amp;gt;&amp;#34;:()V&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       4: &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public pl.kodolamacz.myclasses.Person&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;java.lang.String, java.lang.String, int&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Code:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       0: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       1: invokespecial &lt;span style=&#34;color:#75715e&#34;&gt;#1                  // Method java/lang/Object.&amp;#34;&amp;lt;init&amp;gt;&amp;#34;:()V&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       4: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       5: aload_1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       6: putfield      &lt;span style=&#34;color:#75715e&#34;&gt;#2                  // Field forename:Ljava/lang/String;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       9: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      10: aload_2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      11: putfield      &lt;span style=&#34;color:#75715e&#34;&gt;#3                  // Field surname:Ljava/lang/String;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      14: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      15: iload_3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      16: putfield      &lt;span style=&#34;color:#75715e&#34;&gt;#4                  // Field age:I&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      19: &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public void introduceYourself&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Code:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       0: getstatic     &lt;span style=&#34;color:#75715e&#34;&gt;#5                  // Field java/lang/System.out:Ljava/io/PrintStream;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       3: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       4: getfield      &lt;span style=&#34;color:#75715e&#34;&gt;#2                  // Field forename:Ljava/lang/String;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       7: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       8: getfield      &lt;span style=&#34;color:#75715e&#34;&gt;#3                  // Field surname:Ljava/lang/String;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      11: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      12: getfield      &lt;span style=&#34;color:#75715e&#34;&gt;#4                  // Field age:I&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      15: invokedynamic &lt;span style=&#34;color:#75715e&#34;&gt;#6,  0              // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      20: invokevirtual &lt;span style=&#34;color:#75715e&#34;&gt;#7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      23: &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  public int growOld&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;int&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Code:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       0: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       1: dup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       2: getfield      &lt;span style=&#34;color:#75715e&#34;&gt;#4                  // Field age:I&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       5: iload_1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       6: iadd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;       7: putfield      &lt;span style=&#34;color:#75715e&#34;&gt;#4                  // Field age:I&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      10: aload_0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      11: getfield      &lt;span style=&#34;color:#75715e&#34;&gt;#4                  // Field age:I&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      14: ireturn&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;gotowy-program&#34;&gt;Gotowy program&#xA;&lt;/h1&gt;&lt;p&gt;W przeciwieństwie do programów napisanych np. w języku C++, gotowe programy, czyli zbiór plików *&lt;em&gt;.class&lt;/em&gt;, nie są umieszczane w pliku &lt;strong&gt;exe&lt;/strong&gt;, lecz są pakowane do plików &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;.jar&lt;/strong&gt;&lt;/a&gt;. Plik &lt;em&gt;jar&lt;/em&gt; to tak naprawdę plik typu &lt;em&gt;zip&lt;/em&gt;, dlatego bez problemu możemy go otworzyć i zobaczyć co jest w środku oraz dzięki kompresji ma on mniejszy rozmiar. Oprócz plików *&lt;em&gt;.class&lt;/em&gt;., we wnętrzu pliku &lt;em&gt;jar&lt;/em&gt; mogą znajdować się dodatkowe pliki potrzebne do wykonania programu.&lt;/p&gt;&#xA;&lt;p&gt;W środowisku IntelliJ IDEA, by zbudować plik &lt;em&gt;jar&lt;/em&gt; ze swojego projektu, należy wejść do ustawień projektu (Plik -&amp;gt; Project Structure). W nowo otwartym oknie należy kliknąć zakładkę &amp;ldquo;Artifacts&amp;rdquo; z lewej strony, a następnie nacisnąć zielony przycisk &amp;ldquo;plus&amp;rdquo;. Z listy wybieramy opcję &amp;ldquo;JAR&amp;rdquo;, a następnie &amp;ldquo;From modules with dependencies&amp;rdquo;. W kolejnym okienku wskazujemy klasę z metodą &lt;em&gt;main&lt;/em&gt;, którą chcemy uruchomić, naciskamy &amp;ldquo;OK&amp;rdquo; i zamykamy wszystkie okna ponownie naciskając &amp;ldquo;OK&amp;rdquo;. Gdy już mamy stworzony artefakt definiujący nasz plik &lt;em&gt;jar&lt;/em&gt;, wystarczy go zbudować klikając &amp;ldquo;Build -&amp;gt; Build Artifacts&amp;rdquo;, a następnie wybierając nazwę naszego artefaktu i klikając znowu &amp;ldquo;Build&amp;rdquo;. Nasz plik pojawi się w katalogu &amp;ldquo;out/artifacts/**&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Plik &lt;em&gt;jar&lt;/em&gt; możemy uruchomić używając polecenia &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/deployment/jar/run.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;java&lt;/strong&gt;&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;java -jar my-jar.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Informacja o klasie, w której uruchamiana jest metoda &lt;strong&gt;main&lt;/strong&gt;, znajduje się w pliku &lt;em&gt;MANIFEST.MF&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Manifest&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Version: 1.&lt;span style=&#34;color:#a6e22e&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Main&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;Class: pl.&lt;span style=&#34;color:#a6e22e&#34;&gt;kodolamacz&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;MyApplication&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;jak-to-działa&#34;&gt;Jak to działa?&#xA;&lt;/h1&gt;&lt;p&gt;Jednak co się dzieje, gdy próbujemy uruchomić nasz plik &lt;em&gt;jar&lt;/em&gt;? W pierwszej kolejności, uruchamiana jest maszyna wirtualna &lt;em&gt;Java&lt;/em&gt;. Pierwszą rzeczą którą robi to załadowanie klas, czyli wczytanie plików &lt;strong&gt;.class&lt;/strong&gt; znajdujących się w pliku &lt;em&gt;jar&lt;/em&gt;. Odpowiada za to narzędzie zwane &lt;strong&gt;ClassLoader&lt;/strong&gt;. Po wczytaniu następuje proces łączenia (Linking), który dzieli się na pięć etapów. Najpierw następuje weryfikacja (Verification) poprawności klas, potem faza przygotowania (Preparation) gdzie następuje stworzenie pól statycznych oraz ich inicjalizacja wartościami domyślnymi, a następnie etap rozwiązania (Resolution) zależności pomiędzy klasami, czyli upewnienia się, że wszystkie typy z których chcemy skorzystać są dostępne oraz czy mają oczekiwane pola i metody. To w ostatnim etapie możemy dostać takie błędy jak &lt;em&gt;NoSuchFieldError&lt;/em&gt;, &lt;em&gt;NoSuchMethodError&lt;/em&gt;, &lt;em&gt;IllegalAccessError&lt;/em&gt; znane dobrze programistom Java. Gdy wszystko zostanie prawidłowo rozwiązane, następuje faza sprawdzenia dostępów do pól, metod i klas (Access Control), czyli uwzględnienie takich słów jak &lt;em&gt;public&lt;/em&gt;, &lt;em&gt;protected&lt;/em&gt;, &lt;em&gt;private&lt;/em&gt;, a na koniec faza zastępowania nadpisanych metod (Overriding). Gdy już przeszliśmy przez proces łączenia (Linking), następuje faza inicjalizacji klas, po której są one już gotowe do użycia. Jeśli korzystamy z metod natywnych, np. napisanych w języku C++, są one ładowane po inicjalizacji klas. Teraz następuje wykonanie naszego programu. Gdy program zamyka się, wywoływana jest metoda &lt;em&gt;System.exit(status)&lt;/em&gt;, która znowu wywołuje &lt;em&gt;Runtime.getRuntime().exit(status)&lt;/em&gt;. Wtedy następuje zatrzymanie maszyny wirtualnej i zwolnienie wszystkich zasobów.&lt;/p&gt;&#xA;&lt;p&gt;Proces ten w całości opisany jest w &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/specs/jvms/se10/html/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;specyfikacji&lt;/a&gt; maszyny wirtualnej w rozdziale piątym.&lt;/p&gt;&#xA;&lt;h1 id=&#34;optymalizacja&#34;&gt;Optymalizacja&#xA;&lt;/h1&gt;&lt;p&gt;W trakcie działania maszyny wirtualnej, nasz kod, dokładnie bytecode, jest tłumaczony na kod maszynowy i wykonywany. Na pierwszy rzut oka może się wydawać, że ten proces dodatkowego tłumaczenia jest zbyt dużym kosztem działania programu, przez co powstało wiele legend mówiących o tym, że Java czy ogólnie środowisko JVM jest wolne. Oczywiście nie jest to prawdą, bo maszyny wirtualne zawierają w sobie szereg optymalizacji stosowanych w trakcie wykonywania programu, przez co potrafią uruchamiać operacje prawie tak szybko jak natywny kod napisany w języku C/C++ czy nawet niekiedy szybciej. Dzieje się to dzięki dynamicznemu kompilatorowi &lt;strong&gt;JIT&lt;/strong&gt; czyli &lt;strong&gt;Just-In-Time&lt;/strong&gt;. Jego zadaniem jest właśnie tłumaczenie kodu maszyny wirtualnej (bytecode) do kodu maszynowego wykonywanego na danym urządzeniu. W swojej pracy uwzględnia on zarówno to jak program działa, jak i architekturę sprzętową na którym działa program. Dlatego potrafi on jednocześnie przyśpieszyć często używane fragmenty kodu (tak zwane gorące punkty) jak i zoptymalizować kod wynikowy z uwzględnieniem używanego typu procesora. To właśnie uwzględnianie danego sprzętu oraz to jak program pracuje może spowodawać, że stworzony przez JIT kod maszynowy może być tak wydajny.  Oczywiście może się okazać, że próby optymalizacyjne zastosowane przez JIT nie przyniosły oczekiwanego skutku, lecz wręcz przeciwny, więc kompilator może się wycofać ze swoich zmian i inaczej skompilować kod wynikowy. Takie próby skutkują tym, że maszyna wirtualna, do osiagnięcia swojej pełnej wydajności, potrzebuje się &amp;ldquo;rozgrzać&amp;rdquo;. Dlatego największy zysk ze stosowania JIT uzyskamy dla programów działających przez dłuższy czas, stąd bardzo często Java jest stosowana w rozwiazaniach serwerowych.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #3: Programowanie obiektowe</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%233-programowanie-obiektowe/</link>
            <pubDate>Sun, 29 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%233-programowanie-obiektowe/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-3.png&#34; alt=&#34;Featured image of post Wyzwanie Java #3: Programowanie obiektowe&#34; /&gt;&lt;p&gt;W dzisiejszym poście dotyczącym programowania w języku Java powiemy sobie o programowaniu obiektowym (ang. Object Oriented Programming, OOP). Wszystko co nas otacza, jest obiektem - przedmioty, zwierzęta, budynki, ludzie itd. itp. Żyjemy w świecie obiektów. Dlatego by łatwiej opisywać otaczający nas świat, podjęto próby przeniesienia go do języków programowania.&lt;/p&gt;&#xA;&lt;p&gt;Jako pierwsi podjęli się tego zadania Ole-Johana Dahla i Kristena Nygaarda z Norweskiego ośrodka obliczeniowego w Oslo, którzy pracowali nad symulacjami zachowania się statków. Wprowadzili oni &lt;strong&gt;obiekty&lt;/strong&gt;, &lt;strong&gt;klasy&lt;/strong&gt;, &lt;strong&gt;dziedziczenie&lt;/strong&gt; i wiele innych pojęć do języka &lt;em&gt;Simula 67&lt;/em&gt;. Koncepcja OOP została następnie dopracowana w języku &lt;em&gt;Smalltalk&lt;/em&gt;, który uważany jest za pierwszy w pełni obiektowy język programowania. Idea OOP zainspirowała duńskiego informatyka Bjarne Stroustrup&amp;rsquo;a do rozszerzenia języka &lt;em&gt;C&lt;/em&gt; o paradygmat programowania obiektowego, dzięki czemu narodził się jeden z najpopularniejszych języków programowania jakim jest &lt;em&gt;C++&lt;/em&gt;. Od tamtego momentu, czyli połowy lat 80tych, programowanie obiektowe stało się najpopularniejszym paradygmatem programowania. Innymi popularnymi paradygmatami jest &lt;strong&gt;programowanie strukturalne&lt;/strong&gt; występujące w starszych językach programowania lub językach skryptowych oraz obecnie coraz popularniejsze &lt;strong&gt;programowanie funkcyjne&lt;/strong&gt;, któremu poświęcimy oddzielne wyzwanie!&lt;/p&gt;&#xA;&lt;p&gt;Z racji tego, że dobre zrozumienie idei programowania obiektowego jest niezmiernie ważne, by płynnie posługiwać się tym językiem programowania, prosimy Was o rzetelne i uważne przeczytanie poniższego artykułu.&lt;/p&gt;&#xA;&lt;h3 id=&#34;java-i-programowanie-obiektowe&#34;&gt;Java i programowanie obiektowe&#xA;&lt;/h3&gt;&lt;p&gt;Java od początku istnienia jest językiem programowania, który jest językiem obiektowym. Koncepcja &lt;strong&gt;obiektów&lt;/strong&gt; jest tutaj na tyle silna, że do tej pory, nie wiedząc jeszcze co to OOP, my także w swoich programach tworzyliśmy obiekty! Jedynym wyjątkiem jest optymalizacja użyta przez twórców języka, mianowicie typy proste, czyli poznane wcześniej typy jak &lt;em&gt;int&lt;/em&gt;, &lt;em&gt;long&lt;/em&gt;, &lt;em&gt;double&lt;/em&gt; lub &lt;em&gt;boolean&lt;/em&gt;. Twórcy zdecydowali się na wprowadzenie tego wyjątku, żeby zapewnić wysoką wydajność - zwłaszcza w początkach istnienia języka Java, gdy komputery były znacznie gorsze niż obecne. Jak się za chwilę dowiemy, te typy mają jednak swoich obiektowych braci.&lt;/p&gt;&#xA;&lt;h3 id=&#34;obiekty-i-klasy&#34;&gt;Obiekty i klasy&#xA;&lt;/h3&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/javaOO/objects.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Obiekt&lt;/strong&gt;&lt;/a&gt; to jest jakiś byt, coś co istnieje w naszym programie. Oznacza to, że chcąc skorzystać z jakiegoś obiektu, musimy go najpierw stworzyć. Do tego celu nasz program musi mieć opis takiego obiektu, który nazywamy &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/javaOO/classes.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;klasami&lt;/strong&gt;&lt;/a&gt;. Gdyby chcieć przenieść to na świat codzienny, klasy są czymś w rodzaju projektu domu lub kodu DNA, zaś obiekt jest już zbudowanym budynkiem lub stworzeniem z danym kodem DNA. Do tworzenia klas w Javie używamy słówka &lt;strong&gt;class&lt;/strong&gt;. Poniżej przykład takiej klasy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Powyższy kod jest nam bardzo dobrze znany, stworzyliśmy go w naszym pierwszym wyzwaniu! Widać w nim, że &lt;em&gt;MyFirstJavaApplication&lt;/em&gt; jest właśnie klasą, czyli DNA naszego obiektu.&lt;/p&gt;&#xA;&lt;h3 id=&#34;pakiety&#34;&gt;Pakiety&#xA;&lt;/h3&gt;&lt;p&gt;W pierwszej linii naszego powyższego kodu widzimy instrukcję &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/package/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;package&lt;/strong&gt;&lt;/a&gt;. Jest to tak zwany &lt;strong&gt;pakiet&lt;/strong&gt; lub &lt;strong&gt;ścieżka pakietowa&lt;/strong&gt; naszej klasy. Pakiety służą do logicznego podziału i segregacji naszego kodu oraz niwelują możliwość pojawienia się kolizji, gdy dwie osoby stworzą dwie klasy o takiej samej nazwie, pod warunkiem, że będą miały inne pakiety.&lt;/p&gt;&#xA;&lt;p&gt;Zwyczajowo ścieżka pakietowa zaczyna się odwróconą domeną internetową naszej firmy, organizacji lub naszą własną, stąd &lt;strong&gt;kodolamacz.pl&lt;/strong&gt; dał nam &lt;strong&gt;pl.kodolamacz&lt;/strong&gt;, choć tak naprawdę możemy dowolnie kreować nazwy naszych pakietów, z wyjątkiem pakietów zaczynających się od słowa &lt;strong&gt;java&lt;/strong&gt;, takich nie można tworzyć. Nazwy pakietów można w sobie dowolnie zagłębiać, dlatego zamiast &lt;em&gt;pl.kodolamacz&lt;/em&gt; moglibyśmy śmiało skorzystać z ścieżki &lt;em&gt;pl.kodolamacz.moj.super.pakiet&lt;/em&gt;. Fizycznie, pakiety są reprezentowane przez katalogi, dlatego jeśli odnajdziecie na swoim lokalnym dyski katalog z projektem i odnajdziecie tam katalog z źródłami waszego programu, czyli &lt;strong&gt;src&lt;/strong&gt; (ang. source), to zobaczycie katalog &lt;em&gt;pl&lt;/em&gt; a w nim podkatalog &lt;em&gt;kodolamacz&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Klasy są zapisywane w plikach *&lt;strong&gt;.java&lt;/strong&gt;. Jeden plik może zawierać tylko jedną klasę publiczną (słowo public przed class) oraz nazwa klasy i pliku musi być identyczna. (O innych typach klas powiemy sobie w kolejnym wyzwaniu)&lt;/p&gt;&#xA;&lt;p&gt;Jeśli chcemy w naszym kodzie użyć innej klasy, z innego pakietu, musimy ją &lt;strong&gt;zaimportować&lt;/strong&gt; do naszej klasy. Służy do tego słówko &lt;strong&gt;import&lt;/strong&gt;. Jedynym wyjątkiem są klasy z pakietu &lt;strong&gt;java.lang&lt;/strong&gt;, które są zawsze domyślnie importowane oraz klasy z tego samego pakietu co nasza klasa, ich także nie trzeba importować.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład naszego programu z importem:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli chcemy zaimportować kilka klas z jakiegoś pakietu, możemy użyć symbolu &amp;quot; * &amp;quot; w celu załadowania całego pakietu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.*;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pytanie, co jeśli chcemy użyć w naszym kodzie dwóch klas o takiej samej nazwie, ale w innym pakiecie? Na przykład klasa &lt;em&gt;Date&lt;/em&gt; znajduje się zarówno w pakiecie &lt;em&gt;java.util&lt;/em&gt; jak i &lt;em&gt;java.sql&lt;/em&gt; (oczywiście są to dwie zupełnie inne klasy). Możemy wtedy pisząc nasz kod wskazać pełną nazwę klasy wraz z pakietami, jak w kodzie poniżej. Wtedy polecenie &lt;strong&gt;import&lt;/strong&gt; nie będzie już nam potrzebne.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        java.&lt;span style=&#34;color:#a6e22e&#34;&gt;util&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Date&lt;/span&gt; date1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; java.&lt;span style=&#34;color:#a6e22e&#34;&gt;util&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Date&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        java.&lt;span style=&#34;color:#a6e22e&#34;&gt;sql&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Date&lt;/span&gt; date2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; java.&lt;span style=&#34;color:#a6e22e&#34;&gt;sql&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Date&lt;/span&gt;(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;currentTimeMillis&lt;/span&gt;());&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Od Java w wersji 5, można importować nie tylko klasy, ale także metody i pola statyczne. Korzystamy wtedy z polecenia &lt;strong&gt;import static&lt;/strong&gt;. Poniżej przykład kodu Witaj Świecie z pierwszego wyzwania z użyciem importu statycznego, gdzie zaimportowaliśmy pole statyczne &lt;em&gt;System.out&lt;/em&gt;, dzięki czemu nie musieliśmy pisać &lt;em&gt;System.out.println(&amp;ldquo;Witaj świecie!&amp;rdquo;);&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import static&lt;/span&gt; java.lang.System.out;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        out.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świecie!&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;metody-i-pola&#34;&gt;Metody i pola&#xA;&lt;/h3&gt;&lt;p&gt;Klasy składają się z &lt;strong&gt;metod&lt;/strong&gt; (ang. methods) i &lt;strong&gt;pól&lt;/strong&gt; (ang. fields). Pola klasy możemy rozumieć jako pewien zbiór cech, które możemy przypisać obiektowi, np. klasa &lt;em&gt;człowiek&lt;/em&gt; może mieć pole &lt;em&gt;wiek&lt;/em&gt;. Metody możemy traktować jako pewne akcje które możemy wykonać na obiekcie, jak np. &lt;em&gt;zjedz&lt;/em&gt; czy &lt;em&gt;pracuj&lt;/em&gt;. Poniżej przykład takiej klasy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.myclasses;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Trzy pola naszej klasy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Metoda przedstaw się wyświetlająca w konsoli napis&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nazywam się &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; forename &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; surname &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;. Mam &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; age &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; lat.&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pola deklarujemy podobnie jak zmienne z poprzedniego wyzwania. Jedyna różnica jest taka, że mają zdefiniowany dostęp (słowo public), o którym powiemy więcej w dalszej części.&lt;/p&gt;&#xA;&lt;p&gt;Metoda to jakiś kawałek kodu, który możemy wykonać na obiekcie. Metody mają zawsze dostęp do pól zadeklarowanych w tej samej klasie. Nasza metoda &lt;em&gt;introduceYourself&lt;/em&gt; wyświetla nam informację o imieniu i nazwisku osoby. Metodę też możemy porównać do funkcji znanej z matematyki, np. &lt;em&gt;y = ax + b&lt;/em&gt;. Taka funkcja &lt;em&gt;y&lt;/em&gt; przyjmuje parametr &lt;em&gt;x&lt;/em&gt; i korzystając z dwóch liczb &lt;em&gt;a&lt;/em&gt; i &lt;em&gt;b&lt;/em&gt;, które w naszym przypadku mogą być polami klasy, zwraca wynik tego działania. Tak samo metody w Javie mogą zwracać jakiś wynik oraz przyjmować parametry. Typ wyniku (np. int) podajemy przed nazwą metody, zaś przyjmowane parametry w nawiasach. Poniżej przykład metody przyjmującej parametr i zwracającej wynik, w tym przypadku zwiększającej i zwracającej ten wiek. Do zwrócenia wyniku używamy słowa kluczowego &lt;strong&gt;return&lt;/strong&gt;. Jeśli metoda nie zwraca żadnej wartości, zamiast typu używamy &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;słowa kluczowego&lt;/a&gt; &lt;strong&gt;void&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.myclasses;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nazywam się &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; forename &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; surname &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;. Mam &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; age &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; lat.&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Metoda dorośnij, zwiększająca wiek osoby o wskazaną ilość lat&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; years) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        age &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; years;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gdy już mamy naszą klasę &lt;em&gt;osoba&lt;/em&gt;, możemy stworzyć na jej podstawie obiekt, przypisać jego zmiennym wartości i wywołać jego metody. Do tworzenia klas służy &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;słowo kluczowe&lt;/a&gt; &lt;strong&gt;new&lt;/strong&gt;. Poniżej przykład wykonania wszystkich powyższych operacji:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.myclasses.Person;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyThirdJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Person person1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Person(); &lt;span style=&#34;color:#75715e&#34;&gt;// tworzymy obiekt&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;forename&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Jan&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// przypisujemy polu imię wartość&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;surname&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kowalski&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 35;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// wywołujemy metodę&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(5); &lt;span style=&#34;color:#75715e&#34;&gt;// metoda z parametrem&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// jeszcze raz się przedstawiamy z innym wiekiem&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Proszę zauważyć, że klasa &lt;em&gt;Person&lt;/em&gt; znajduje się w pakiecie &lt;em&gt;pl.kodolamacz.myclasses&lt;/em&gt;, przez co musieliśmy użyć słowa kluczowego &lt;em&gt;import&lt;/em&gt; by skorzystać z tej klasy w klasie &lt;em&gt;MyThirdJavaApplication&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Dostęp do &lt;em&gt;pól&lt;/em&gt; i &lt;em&gt;metod&lt;/em&gt; obiektu odbywa się za pomocą znaku kropki podając najpierw nazwę obiektu, a następnie pole lub metodę z tego obiektu.&lt;/p&gt;&#xA;&lt;p&gt;Nazwy klas i obiektów piszemy używając &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/CamelCase&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;em&gt;CamelCase&lt;/em&gt;&lt;/a&gt;, z tą różnicą, że w klasach pierwsza litera jest duża, zaś w nazwach zmiennych mała.&lt;/p&gt;&#xA;&lt;h3 id=&#34;konstruktor&#34;&gt;Konstruktor&#xA;&lt;/h3&gt;&lt;p&gt;Do stworzenia obiektu &lt;em&gt;osoba&lt;/em&gt; z powyższego kodu użyliśmy słowa &lt;strong&gt;new&lt;/strong&gt;. Podczas tej operacji wywoływany jest tak zwany &lt;strong&gt;konstruktor&lt;/strong&gt;, czyli specjalna metoda, która tworzy nam nasz obiekt. Jeśli nie napiszemy sami &lt;em&gt;konstruktora&lt;/em&gt;, klasa dostaje tak zwany &lt;em&gt;konstruktor domyślny&lt;/em&gt;, który wygląda tak jak na poniższym przykładzie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.myclasses;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Konstruktor domyślny&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nazywam się &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; forename &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; surname &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;. Mam &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; age &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; lat.&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; years) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        age &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; years;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Konstruktory nieco różnią się od zwykłych metod takich jak &lt;em&gt;introduceYourself&lt;/em&gt; czy &lt;em&gt;growOld&lt;/em&gt;. Ich nazwa musi być dokładnie taka sama jak nazwa klasy. Konstruktory także nie mają słowa &lt;em&gt;void&lt;/em&gt; lub zwracanego typu.&lt;/p&gt;&#xA;&lt;p&gt;Niestety, konstruktor domyślny nie pozwala nam przypisać wartości do tworzonych pól, dlatego zawsze możemy taki konstruktor zamienić na własny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.myclasses;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Konstruktor domyślny&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Konstruktor z trzema parametrami&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;(String initForename, String initSurname, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; initAge) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        forename &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; initForename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        surname &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; initSurname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        age &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; initAge;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nazywam się &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; forename &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; surname);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; years) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        age &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; years;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mając nasz konstruktor możemy już w zupełnie inny sposób napisać nasz program:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; pl.kodolamacz.myclasses.Person;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyThirdJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Person person1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Person(); &lt;span style=&#34;color:#75715e&#34;&gt;// tworzymy obiekt&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;forename&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Jan&amp;#34;&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// przypisujemy polu imię wartość&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;surname&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kowalski&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 35;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// wywołujemy metodę&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(5); &lt;span style=&#34;color:#75715e&#34;&gt;// metoda z parametrem&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person1.&lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;(); &lt;span style=&#34;color:#75715e&#34;&gt;// poprzednia metoda po zmianie parametrów&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Person person2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Person(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomasz&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nowak&amp;#34;&lt;/span&gt;, 56); &lt;span style=&#34;color:#75715e&#34;&gt;// konstruktor z parametrami&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        person2.&lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym kodzie stworzyliśmy już dwa obiekty klasy &lt;em&gt;Person&lt;/em&gt;. W tym przypadku nie musimy ustawiać parametrów przez odwołanie się do obiektu, wystarczy przekazać je do konstruktora.&lt;/p&gt;&#xA;&lt;p&gt;Gdybyśmy chcieli użyć parametru metody lub konstruktora o takiej samej nazwie jak jedno z pól, możemy nadal odwołać się do pola, poprzez użycie słowa &lt;strong&gt;this&lt;/strong&gt;. Poniżej przykład konstruktora oraz metody z kolizją nazw parametrów i pól:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz.myclasses;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; String surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Konstruktor domyślny&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Konstruktor z trzema parametrami&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Person&lt;/span&gt;(String forename, String surname, &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;forename&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; forename;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;surname&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; surname;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;introduceYourself&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nazywam się &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; forename &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; surname &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;. Mam &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; age &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; lat.&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;growOld&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; age) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; age;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;age&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;kontrola-dostępu-do-klas&#34;&gt;Kontrola dostępu do klas&#xA;&lt;/h3&gt;&lt;p&gt;Klasy mają swój &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;zasięg&lt;/a&gt;. Dzielimy je na klasy publiczne &lt;strong&gt;public class&lt;/strong&gt; oraz na pakietowe (package-private), kiedy to mamy tylko słówko &lt;strong&gt;class&lt;/strong&gt; bez public. Klasy publiczne można importować w dowolnej innej klasie, zaś klas pakietowych możemy używać tylko w klasach w tym samym pakiecie!&lt;/p&gt;&#xA;&lt;p&gt;Dodatkowo wyróżniamy 4 modyfikatory dostępu do pól i metod klasy:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;public - wszyscy mają dostęp&lt;/li&gt;&#xA;&lt;li&gt;protected - widzą wszyscy w tym pakiecie i Ci co rozszerzają tą klasę&lt;/li&gt;&#xA;&lt;li&gt;default - widać tylko w tym pakiecie&lt;/li&gt;&#xA;&lt;li&gt;private - tylko ta klasa widzi swoje pola&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Powyższą zasadę można przedstawić za pomocą tabeli:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Klasa&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Pakiet&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Podklasa&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Wszyscy&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;public&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;protected&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;default&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;private&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;+&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Należy zauważyć, że widoczność &lt;strong&gt;default&lt;/strong&gt; uzyskujemy nie wpisując żadnego słowa przy polu, metodzie lub klasie! W Javie mamy słowo kluczowe &lt;em&gt;default&lt;/em&gt;, ale służy do zupełnie czegoś innego, o czym przekonamy się w kolejnym wyzwaniu.&lt;/p&gt;&#xA;&lt;h3 id=&#34;metody-i-pola-statyczne&#34;&gt;Metody i pola statyczne&#xA;&lt;/h3&gt;&lt;p&gt;We wcześniejszych przykładach tworzyliśmy &lt;em&gt;pola&lt;/em&gt; i &lt;em&gt;metody&lt;/em&gt; które należały do obiektu, to znaczy, by się do nich odwołać (pola) lub je wykonać &lt;em&gt;metody&lt;/em&gt; musieliśmy najpierw stworzyć obiekt z naszej klasy. Są jednak sytuacje, gdzie dla skorzystania z jakichś pól lub metod, nie chcemy tworzyć nowych obiektów. Dobrym przykładem tutaj mogą być jakieś stałe wartości jak liczba &lt;em&gt;PI&lt;/em&gt; lub funkcje matematyczne. Poniżej klasa &lt;em&gt;Circle&lt;/em&gt; reprezentująca koło/okrąg wraz z promieniem (radius) oraz metodami zwracającymi pole powierzchni koła oraz obwód okręgu.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package pl.kodolamacz;&#xA;&#xA;public class Circle {&#xA;&#xA;    private int radius;&#xA;&#xA;    public Circle(int radius) {&#xA;        this.radius = radius;&#xA;    }&#xA;&#xA;    public double area() {&#xA;        return Math.PI * Math.pow(radius, 2);&#xA;    }&#xA;&#xA;    public double circumference() {&#xA;        return 2 * Math.PI * radius;&#xA;    }&#xA;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;W powyższym kodzie użyta została stała &lt;strong&gt;Math.PI&lt;/strong&gt; oraz metoda &lt;strong&gt;Math.pow()&lt;/strong&gt; klasy &lt;em&gt;Math&lt;/em&gt; z pakietu &lt;em&gt;java.lang&lt;/em&gt; (niepotrzebny import!). By z nich skorzystać nie tworzyliśmy obiektu klasy &lt;strong&gt;Math&lt;/strong&gt; (nie jest to nawet możliwe gdyż konstruktor ma dostęp oznaczony jako &lt;em&gt;private&lt;/em&gt;), a jedynie skorzystaliśmy bezpośrednio z samej metody i pola klasy. Takie pola i metody z których możemy skorzystać bez obiektu nazywamy &lt;strong&gt;statycznymi&lt;/strong&gt;. Tworzymy je za pomocą słowa &lt;strong&gt;static&lt;/strong&gt;. Poniżej interesująca nas metoda i stała klasy &lt;em&gt;java.lang.Math&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; java.lang;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Math&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Don&amp;#39;t let anyone instantiate this class.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Math&lt;/span&gt;() {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; PI &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 3.&lt;span style=&#34;color:#a6e22e&#34;&gt;14159265358979323846&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pow&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; a, &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; b) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; StrictMath.&lt;span style=&#34;color:#a6e22e&#34;&gt;pow&lt;/span&gt;(a, b);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}   &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym przykładzie skorzystaliśmy z klasy wbudowanej w język Java. Dodatkowo sami także możemy tworzyć oraz wykorzystywać pola i metody statyczne. Także metoda &lt;strong&gt;main&lt;/strong&gt;, której używaliśmy w tym i poprzednich wyzwaniach, jest właśnie metodą statyczną!&lt;/p&gt;&#xA;&lt;p&gt;Zarówno pole &lt;strong&gt;Math.PI&lt;/strong&gt; oraz metodę &lt;strong&gt;Math.pow()&lt;/strong&gt; możemy zaimportować statycznie. Nasz kod będzie wtedy wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import static&lt;/span&gt; java.lang.Math.PI;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import static&lt;/span&gt; java.lang.Math.pow;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Circle&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; radius;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Circle&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; radius) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;radius&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; radius;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;area&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; PI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; pow(radius, 2);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;circumference&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; 2 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; PI &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; radius;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W niektórych językach programowania wprowadza się oddzielnie pojęcie &lt;strong&gt;metody&lt;/strong&gt; i &lt;strong&gt;funkcji&lt;/strong&gt;. Metody są związane z jakimś obiektem, zaś funkcje są samoistnymi bytami. W języku Java nie ma możliwości stworzenia funkcji, czyli metody poza klasą, dlatego nawet metody statyczne z których możemy korzystać bezpośrednio wskazując klasę, a nie obiekt, są tak naprawdę metodami, a nie funkcjami.&lt;/p&gt;&#xA;&lt;h3 id=&#34;typy-proste-a-obiekty&#34;&gt;Typy proste a obiekty&#xA;&lt;/h3&gt;&lt;p&gt;Jak dowiedzieliśmy się wcześniej, typy proste takie jak &lt;em&gt;int&lt;/em&gt;, &lt;em&gt;long&lt;/em&gt;, &lt;em&gt;double&lt;/em&gt; czy &lt;em&gt;boolean&lt;/em&gt; nie są obiektami. Zdecydowali to twórcy języka w celu osiągnięcia większej wydajności. Mimo to, każdy z typów prostych ma swój &amp;ldquo;obiektowy&amp;rdquo; odpowiednik. Dodatkowo w javie mamy mechanizm zwany &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;em&gt;Autoboxing&lt;/em&gt;&lt;/a&gt; oraz &lt;em&gt;Unboxing&lt;/em&gt; automatycznie konwertujący typy proste w obiekty i odwrotnie. Poniżej przykłady konwersji typów prostych na i z obiektów:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;AutoboxingAndUnboxing&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Integer(7); &lt;span style=&#34;color:#75715e&#34;&gt;// konstruktor jest deprecated&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Integer a3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Integer(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;8);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Integer a4 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;19;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Integer a5 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Integer.&lt;span style=&#34;color:#a6e22e&#34;&gt;valueOf&lt;/span&gt;(34);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String s1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Text 1&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String s2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; String(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Text 1&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Character ch1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; ch2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Poniżej tabela pokazująca mapowanie typów prostych na ich wersje obiektowe lub inaczej opakowujące (ang. wrapper):&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Typ prosty&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Wrapper&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;boolean&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Boolean&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;byte&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Byte&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;char&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Character&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;float&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Float&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;int&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Integer&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;long&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Long&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;short&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Short&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;double&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Double&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;wyzwanie&#34;&gt;Wyzwanie&#xA;&lt;/h2&gt;&lt;p&gt;A teraz nasze wyzwanie. Nasz kalkulator, który stworzyliśmy w poprzednim wyzwaniu, miał jeden mały problem - operacje zmiennoprzecinkowe, czyli takie które przyjmowały lub tylko zwracały liczby niecałkowite (np. 10 podzielić na 3) zaokrąglały wynik. Niestety jest to problem, gdy zależy nam na bardzo dużej dokładności i nie możemy pozwolić sobie na zaokrąglenia (np. operacje finansowe). Dlatego w tym wyzwaniu chcielibyśmy, byście stworzyli ulepszoną wersję kalkulatora, która nie pracuje na liczbach typu &lt;em&gt;double&lt;/em&gt;, a na waszej klasie &lt;em&gt;Fraction&lt;/em&gt; (&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/U%C5%82amek&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;ułamek&lt;/a&gt;). Klasa ta powinna posiadać pole licznika, mianownika i części całkowitej oraz metody pozwalające na dodawanie, odejmowanie, mnożenie, dzielenie i skracanie ułamków, czyli wszystkie najważniejsze operacje jakich mogliśmy się nauczyć w szkole. Program powinien wszystkie wczytywane liczby w kalkulatorze od razu zamieniać na ułamki i na nich dokonywać wszystkich działań. Należy pamiętać o sprowadzaniu ułamków do wspólnego mianownika. Oczywiście chcemy stworzyć klasę &lt;em&gt;Fraction&lt;/em&gt; samodzielnie, bez posiłkowania się klasami z pakietu &lt;em&gt;java.math&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;strong&gt;Rozwiązanie wyzwania #3 opublikujemy w piątek na &lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;stronie naszego wydarzenia na Facebooku&lt;/a&gt;. W międzyczasie będziemy tam też zamieszczać materiały dodatkowe, które uzupełnią Waszą wiedzę na temat Javy i pracy programisty.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jak uda się Wam poprawnie wykonać zadanie - pochwalcie się tym koniecznie w przeznaczonym do tego poście na FB!&lt;/p&gt;&#xA;&lt;p&gt;Kolejna część wyzwania za tydzień, 7 maja o godz. 10:00.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Powodzenia!&lt;/strong&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Czego się uczyć by zostać programistą?</title>
            <link>https://bigdatapassion.pl/blog/czego-si%C4%99-uczy%C4%87-by-zosta%C4%87-programist%C4%85/</link>
            <pubDate>Fri, 27 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/czego-si%C4%99-uczy%C4%87-by-zosta%C4%87-programist%C4%85/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/java/apple-check-computer.jpg&#34; alt=&#34;Featured image of post Czego się uczyć by zostać programistą?&#34; /&gt;&lt;p&gt;Coraz więcej osób widzi swoją przyszłość w zawodzie programisty. Rewolucja informatyczna która dzieje się na naszych oczach spowodowała, że zawód &amp;ldquo;informatyka&amp;rdquo; stał się coraz bardziej rozpoznawalny i doceniany. Mimo, że nasze najmłodsze pociechy pytane o zawód nadal wybierają strażaka, policjanta, nauczyciela czy sportowca, to ich starsi koledzy zaczynają traktować zawód programisty na równi z lekarzem, prawnikiem czy ekonomistą. Widać to choćby coraz mocniej na w rankingach najpopularniejszych kierunków studiów. Pomimo różnych stereotypów powielanych latami, programowanie wydaje się stawać społecznie coraz ciekawszym zajęciem na przyszłość. Przyczyniają się do tego oczywiście życiorysy znanych osób takich jak &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Bill_Gates&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Bill Gates&lt;/a&gt;, założyciel firmy Microsoft i jeden z najbogatszych ludzi świata; &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Steve_Jobs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Steve Jobs&lt;/a&gt; i &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Steve_Wozniak&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Steve Wozniak&lt;/a&gt;, założyciele firmy Apple; &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Larry_Page&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Larry Page&lt;/a&gt; i &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Sergey_Brin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Sergey Brin&lt;/a&gt;, założyciele firmy Google; &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Elon_Musk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Elon Musk&lt;/a&gt;, założyciel firm takich jak PayPal, SpaceX oraz Tesla; &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Mark_Zuckerberg&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Mark Zuckerberg&lt;/a&gt;, założyciel portalu Facebook czy &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Kevin_Mitnick&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Kevin Mitnick&lt;/a&gt;, jeden z najbardziej znanych włamywaczy komputerowych. Są to ludzie którzy odnieśli niebywały sukces i ich nazwiska są rozpoznawalne na całym świecie, nawet przez osoby nie związane w żaden sposób z informatyką. Programiści oraz ludzie z wykształceniem technicznym coraz częściej stają się także bohaterami filmów i seriali, jak choćby znane Dolina Krzemowa, Technicy magicy czy Teoria wielkiego podrywu.&lt;/p&gt;&#xA;&lt;h1 id=&#34;historia&#34;&gt;Historia&#xA;&lt;/h1&gt;&lt;p&gt;Za pierwszego programistę (a właściwie programistkę) w historii uważa się &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Ada_Lovelace&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Adę Lovelace&lt;/a&gt;, która w październiku 1842 roku opublikowała algorytm przeznaczony do wykonania na maszynie Charlesa Babbage. Niektórzy jednak za pierwszego programistę uważają znacznie starszego &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Joseph_Marie_Jacquard&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Joseph&amp;rsquo;a Marie Jacquard&amp;rsquo;a&lt;/a&gt;, który stworzył maszynę Jacquarda, którą można było sterować za pomocą &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Karta_dziurkowana&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;kart perforowanych&lt;/a&gt;. Początkowo przez dłuższy czas, właśnie na podobnych kartach programowało się komputery. Osobą, która jako pierwsza uruchomiła program na komputerze w 1941 roku był &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Konrad_Zuse&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Konrad Zuse&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Za pierwszy wysokopoziomowy język programowania uważany jest język &lt;strong&gt;Fortran&lt;/strong&gt; stworzony w roku 1954. Pięć lat później narodził się język &lt;strong&gt;COBOL&lt;/strong&gt; który powstał dla systemów bankowych. W dwudziestym wieku praktycznie każda transakcja bankowa była przetwarzana przez systemy napisane w tym właśnie języku i jest on używany do dzisiaj. W 1964 roku powstał kolejny znany język programowania zwany &lt;strong&gt;BASIC&lt;/strong&gt;. W 1969 roku narodził się jeden z najpopularniejszych języków programowania, czyli język &lt;strong&gt;C&lt;/strong&gt;, który stopniowo ewaluował w język &lt;strong&gt;C++&lt;/strong&gt; (1983 rok). W 1994 roku w Holandii wydano pierwszą wersję języka &lt;strong&gt;Python&lt;/strong&gt; który zyskał nazwę od Latającego Cyrku Monty Pythona. W 1993 roku, w Japonii, narodził się język Ruby, który miał czerpać to co najlepsze z języków takich jak Python, Perl i Smalltalk. W 1995 roku narodził się język &lt;strong&gt;PHP&lt;/strong&gt; (Personal Home Page) oraz język &lt;strong&gt;Java&lt;/strong&gt;. Rok później została wydana pierwsza wersja języka &lt;strong&gt;JavaScript&lt;/strong&gt;, będącego najpopularniejszym językiem programowania używanym przy tworzeniu stron internetowych. Ostatni z najpopularniejszych języków programowania narodził się w 2000 roku, kiedy to firma Microsoft opracowała język &lt;strong&gt;C#&lt;/strong&gt;. Oczywiście języków programowania jest znacznie więcej, tutaj tylko historia kilku najpopularniejszych. Jak widać, &lt;strong&gt;Java&lt;/strong&gt; jest jednym z młodszych z obecnie używanych języków programowania.&lt;/p&gt;&#xA;&lt;h1 id=&#34;kim-są-programiści&#34;&gt;Kim są programiści?&#xA;&lt;/h1&gt;&lt;p&gt;Informatyka to dyscyplina naukowa wchodząca zarówno w skład obszaru nauk ścisłych w dziedzinie nauk matematycznych, jak i w obszar nauk technicznych w dziedzinę nauk technicznych. Więcej o obszarach, dziedzinach i dyscyplinach naukowych można przeczytać w &lt;a class=&#34;link&#34; href=&#34;http://www.nauka.gov.pl/g2/oryginal/2013_05/748f846e0255320d2846109ed372a25d.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rozporządzeniu Ministra Nauki i Szkolnictwa Wyższego&lt;/a&gt;. Pomijając klasyfikację, informatyka to bardzo szeroka gałąź nauki, mająca swoje podłoże zarówno w matematyce jak i technice. Dlatego pojęcie &amp;ldquo;informatyk&amp;rdquo; bywa bardzo mylące i nie wiele mówiące o zawodzie danej osoby. Dlatego programista, czyli osoba tworząca oprogramowanie, zajmuje się informatyką, jednak jest to dużo szersze pojęcie i nie zawsze związane z programowaniem.&lt;/p&gt;&#xA;&lt;p&gt;O programistach mówi się żartobliwie jako o osobach &amp;ldquo;przetwarzających filiżanki kawy na kod&amp;rdquo;. W przypadku języka Java, którego nazwa pochodzi od ziaren kawy z wyspy Java, nabiera to jeszcze większego sensu.&lt;/p&gt;&#xA;&lt;p&gt;Tak naprawdę programowanie zawodowo odbiega od tego jak możemy sobie ten zawód wyobrażać na początku naszej przygody z programowaniem. Nie zamierzam tutaj w żadnym wypadku nikogo straszyć, a jedynie pokazać pracę programisty z dużo szerszej perspektywy, bowiem okazuje się, że sama umiejętność programowania w wybranym języku, to zaledwie kropla w morzu potrzeb, niczym kropla w filiżance kawy.&lt;/p&gt;&#xA;&lt;h1 id=&#34;czego-się-uczyć-by-zostać-zawodowym-programistą&#34;&gt;Czego się uczyć by zostać zawodowym programistą?&#xA;&lt;/h1&gt;&lt;p&gt;Rzeczą oczywistą jest, że programista powinien znać przynajmniej jeden &lt;strong&gt;język programowania&lt;/strong&gt;. Przynajmniej, bo dzisiaj coraz więcej mówi się o podejściu zwanym &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=nd6lGZFh3u4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Polyglot Programming&lt;/a&gt;. Uczenie się wielu języków programowania ma wiele zalet. Możemy zawsze wybierać najwłaściwszy język do konkretnego zastosowania, zwiększając zarazem swoje kompetencje i możliwości. Takie podejście do programowania rozwija nas, bo możemy patrzeć na języki programowania z perspektywy wielu różnych pomysłów i rozwiązań zastosowanych przez ich twórców. Tak naprawdę bardzo często zdarza się, że twórcy jednego języka inspirują się w nowych wersjach pomysłami z innych języków programowania.&lt;/p&gt;&#xA;&lt;p&gt;Skoro informatyka, a tym samym programowanie, bazuje na matematyce i innych naukach technicznych, okazuje się, że często bywa przydatne posiadanie gruntownej wiedzy teoretycznej. O ile przy tworzeniu prostych aplikacji ta wiedza nie jest nam aż tak potrzebna, to coraz więcej programistów pracuje w projektach związanych z zaawansowanym przetwarzaniem danych, uczeniem maszynowym, sztuczną inteligencją czy obliczeniami rozproszonymi, gdzie taka wiedza jest wręcz niezbędna. Nietrudno znaleźć w internecie oferty pracy firmy Google gdzie oprócz znajomości języka Java, wymagane jest posiadanie stopnia doktora informatyki. Nie każdy oczywiście, chce poświęcić kilka lat by napisać doktorat, nie każdy też będzie pracować przy analizowaniu danych, jednak wiedza na temat tak zwanych &lt;strong&gt;algorytmów i struktur danych&lt;/strong&gt; to minimum, które każdy programista powinien znać i często możemy spotkać się z pytaniami z tego zakresu na rozmowach kwalifikacyjnych.&lt;/p&gt;&#xA;&lt;p&gt;Programując będziemy musieli poznać także teoretyczne podstawy stojące za ideą &lt;strong&gt;programowania obiektowego i funkcyjnego&lt;/strong&gt;, poznać czym to jest i jak prawidłowo tego używać.&lt;/p&gt;&#xA;&lt;p&gt;Znajomość jednego czy nawet wielu języków programowania na poziomie wręcz mistrzowskim, wcale nie gwarantuje, że będziemy potrafili pisać dobre programy. Dlatego niezbędna staje się wiedza także z takich tematów jak &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=RADOhncoohY&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;wzorce projektowe&lt;/strong&gt;&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=CKONKZLmMwk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;dobre praktyki programowania&lt;/strong&gt;&lt;/a&gt; czy &lt;a class=&#34;link&#34; href=&#34;https://helion.pl/ksiazki/czysty-kod-podrecznik-dobrego-programisty-robert-c-martin,czykov.htm&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;czystość kodu&lt;/strong&gt;&lt;/a&gt;. W swojej pracy będziemy także mogli spotkać się z takimi terminami jak &lt;strong&gt;Domain Driven Design&lt;/strong&gt; lub &lt;strong&gt;Behaviour-Driven Development&lt;/strong&gt;. Nie raz też usłyszymy o dobrej &lt;strong&gt;architekturze&lt;/strong&gt; naszych aplikacji. Jest to wiedza, której przyswojenie zajmuje sporo czasu i wymaga doświadczenia, ale zwraca się z nawiązką czyniąc z nas dużo lepszych specjalistów.&lt;/p&gt;&#xA;&lt;p&gt;Kolejnym niezwykle ważnym zagadnieniem podczas programowania jest umiejętność &lt;strong&gt;testowania&lt;/strong&gt; naszego kodu. Musimy tutaj poznać wiele różnych narzędzi i bibliotek jak choćby JUnit, Mockito, AssertJ oraz czym są testy jednostkowe, jak pisać dobre testy jednostkowe, czym jest Test Driven Development oraz przyswoić inne pojęcia z tego zakresu.&lt;/p&gt;&#xA;&lt;p&gt;Nie da się programować bez poznania odpowiednich narzędzi, począwszy od &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=eq3KiAH4IBI&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;IDE&lt;/strong&gt;&lt;/a&gt; (Zintegrowane środowisko programistyczne) przechodząc przez &lt;strong&gt;bazy danych&lt;/strong&gt;, narzędzia do budowania jak np. &lt;strong&gt;Maven&lt;/strong&gt;, środowiska &lt;strong&gt;Continuous Integration&lt;/strong&gt; i &lt;strong&gt;Continuous Delivery&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Programując nigdy nie piszemy wszystkiego sami, bardzo często korzystamy z kodu napisanego przez innych programistów, dlatego w naszej pracy będziemy używać wielu bibliotek i frameworków do tego służących. Do najpopularniejszych bibliotek i frameworków stosowanych przez programistów Java należą np. &lt;strong&gt;Spring&lt;/strong&gt; i &lt;strong&gt;Hibernate&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli chcemy programować aplikacje internetowe, będziemy także musieli poznać narzędzia takie jak serwery aplikacyjne (np. Tomcat, JBoss), biblioteki &lt;strong&gt;JavaScript&lt;/strong&gt; do tworzenia stron internetowych jak Angular, React czy Vue.jd, język HTML oraz CSS. Jeśli znowu chcemy tworzyć aplikacje mobilne musimy poznać np. środowisko Androida, zaś do pisania aplikacji okienkowych biblioteki takie jak Swing, SWT lub JavaFX.&lt;/p&gt;&#xA;&lt;p&gt;Współpracując z innymi programistami nad wspólnym projektem, nie sposób obejść się bez narzędzia, które pozwoli nam wymieniać się kodem oraz przechowywać jego historię zmian. Takie narzędzie nazywamy &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/System_kontroli_wersji&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;systemami kontroli wersji&lt;/strong&gt;&lt;/a&gt;. Najpopularniejszym systemem kontroli wersji jest &lt;strong&gt;Git&lt;/strong&gt;, z którego możemy bezpłatnie skorzystać na popularnym portalu &lt;a class=&#34;link&#34; href=&#34;https://try.github.io&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;em&gt;GitHub&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Pracując w zespole, będziemy też musieli poznać różne techniki prowadzenia projektów pozwalające nam organizować naszę pracę, dlatego nie obce powinny być nam takie zwroty jak &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Programowanie_zwinne&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;&lt;strong&gt;Agile&lt;/strong&gt;&lt;/a&gt;, &lt;strong&gt;Scrum&lt;/strong&gt;, &lt;strong&gt;Kanban&lt;/strong&gt; i inne.&lt;/p&gt;&#xA;&lt;h1 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h1&gt;&lt;p&gt;Jak widać, zostanie programistą wymaga naprawdę sporo pracy. Jeśli marzy się Wam kariera w świecie IT potraktujcie powyższy spis jako listę rzeczy których musicie się nauczyć by osiągnąć sukces. Jednak nie martwcie się, nie jest to wszystko takie trudne jak może na początku się wydawać! Nie wszystko też musicie od razu umieć by dostać swoją pierwszą pracę jako tak zwany młodszy programista lub junior developer, pewne rzeczy będziecie poznawać stopniowo pracując z bardziej doświadczonymi programistami.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #2: Podstawowe instrukcje - rozwiązanie</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%232-podstawowe-instrukcje-rozwi%C4%85zanie/</link>
            <pubDate>Fri, 27 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%232-podstawowe-instrukcje-rozwi%C4%85zanie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-2-solution.png&#34; alt=&#34;Featured image of post Wyzwanie Java #2: Podstawowe instrukcje - rozwiązanie&#34; /&gt;&lt;p&gt;Drugie nasze wyzwanie było już znacznie trudniejsze od poprzedniego, wymagało większego wysiłku, zabawy z kodem czy nawet w niektórych przypadkach doczytania czegoś dodatkowo by zrealizować wasze pomysły. Mimo to poszło Wam świetnie, nadesłaliści wiele różnych, prawidłowych i bardzo ciekawych rozwiązań.&lt;/p&gt;&#xA;&lt;p&gt;Zadanie polegało na stworzeniu uproszczonej wersji kalkulatora. Nasz program miał działać w sposób podobny do poniższego, czyli pobierać od użytkownika dwie liczby, operację matematyczną oraz.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Proszę podaj w oddzielnych linijkach jakąś liczbę, operację matematyczną +,-,*,/,%, a następnie kolejną liczbę:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Twój wynik to: &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Chcesz wykonać kolejne działanie? Wpisz literę t lub n.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W najprostszej postaci nasz program mógłby wyglądać na przykład tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SimpleCalculator&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Proszę podaj w oddzielnych linijkach jakąś liczbę, operację matematyczną +,-,*,/,%, a następnie kolejną liczbę:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String runAgain;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextDouble&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; operation &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextDouble&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; result;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;+&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (operation.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;%&amp;#34;&lt;/span&gt;)) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Nieznana operacja!&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 0;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Twój wynik to: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; result);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Chcesz wykonać kolejne działanie? Wpisz literę t lub n.&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            runAgain &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (runAgain.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;t&amp;#34;&lt;/span&gt;));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Powyższy program robi to co powinien. Mimo to wiele osób zauważyła szereg możliwości ulepszenia swoich programów! Pierwszą rzeczą na którą powinniśmy zwrócić uwagę to obsługa sytuacji wyjątkowych takich jak podanie napisu zamiast liczby i odwrotnie, podanie złego znaku operacji, czy nawet dzielenie przez zero. W kolejnych wyzwaniach powiemy sobie więcej o błędach i wyjątkach w Javie, ale już tutaj warto w jakimś zakresie je obsłużyć.&lt;/p&gt;&#xA;&lt;p&gt;Pamiętajcie także, że w Javie liczby niecałkowite zapisujemy jako double a nie int, czyli korzystając z tego drugiego typu danych (lub innego całkowitego), utracimy informację o części ułamkowej wyniku, stąd w powyższym przykładzie pracujemy na &lt;em&gt;double&lt;/em&gt;. Jeśli korzystaliście z int sprawdźcie wynik dzielenia z resztą w waszym kalkulatorze :)&lt;/p&gt;&#xA;&lt;p&gt;Wiele też osób w swoim zakresie zauważyła, że ciąg warunków &lt;em&gt;if-els&lt;/em&gt;, można zmienić na instrukcję &lt;em&gt;switch&lt;/em&gt;. Tą instrukcję wprowadzimy oficjalnie w jednym z kolejnych wyzwań, ale jak najbardziej także tutaj można jej użyć.&lt;/p&gt;&#xA;&lt;p&gt;Innym problemem który także spotykaliście, to funkcja &lt;em&gt;nextDouble&lt;/em&gt; lub podobna w klasie &lt;em&gt;Scanner&lt;/em&gt; która czyta samą liczbę a nie całą linijkę, dlatego trzeba było albo konwertować linię samodzielnie do liczby albo po wczytaniu liczby dodatkowo wczytać linię do końca.&lt;/p&gt;&#xA;&lt;p&gt;Pamiętajcie też, że zmienne muszą być zawsze zadeklarowane przed użyciem a także kompilator nie pozwoli nam napisać kodu gdzie świadomie nic nie przypisujemy do zmiennej a potem chcemy jej użyć, stąd w powyższym przykładzie przypisanie zera gdy użytkownik podał błędną operację matematyczną.&lt;/p&gt;&#xA;&lt;p&gt;Ostatnią radą dla Was jest różnica między &lt;em&gt;Stringiem&lt;/em&gt; czyli ciągiem znaków a pojedynczym znakiem czyli typem &lt;em&gt;char&lt;/em&gt;. Obsłudze napisów poświęcimy oddzielne wyzwanie, ale już tutaj trzeba pamiętać, że napis, czyli String to zestaw znaków, więc &lt;em&gt;&amp;ldquo;a&amp;rdquo;&lt;/em&gt; nie jest równoważne z &lt;em&gt;&amp;lsquo;a&amp;rsquo;&lt;/em&gt;, bo jedno to napis (String) a drugie jeden konkretny znak! Pamiętajcie też, że łańcuchy znaków zawsze porównujemy dla bezpieczeństwa metodą &lt;em&gt;equals&lt;/em&gt; a nie &lt;em&gt;==&lt;/em&gt;, pomimo, że w niektórych przypadkach może to zadziałać, o czym także powiemy sobie w wyzwaniu dotyczącym napisów.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli macie więcej pytań lub problemów, piszcie do nas śmiało, chętnie pomożemy :) Do zobaczenia w poniedziałek na kolejnym wyzwaniu!&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #2: Podstawowe instrukcje</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%232-podstawowe-instrukcje/</link>
            <pubDate>Mon, 23 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%232-podstawowe-instrukcje/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-2.png&#34; alt=&#34;Featured image of post Wyzwanie Java #2: Podstawowe instrukcje&#34; /&gt;&lt;p&gt;W poprzednim wyzwaniu przygotowaliśmy sobie środowisko do pracy i stworzyliśmy swój pierwszy program. Dzisiaj chcemy podnieść poprzeczkę i poznać podstawowe instrukcje wykorzystywane w języku Java!&lt;/p&gt;&#xA;&lt;p&gt;Przed nami takie rzeczy jak:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Komentarze&lt;/li&gt;&#xA;&lt;li&gt;Zmienne i stałe&lt;/li&gt;&#xA;&lt;li&gt;Typy danych&lt;/li&gt;&#xA;&lt;li&gt;Operatory&lt;/li&gt;&#xA;&lt;li&gt;Instrukcje sterujące&lt;/li&gt;&#xA;&lt;li&gt;Pętle&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Zaczynamy!&lt;/p&gt;&#xA;&lt;h1 id=&#34;komentarze&#34;&gt;Komentarze&#xA;&lt;/h1&gt;&lt;p&gt;Zaczniemy od  zagadnienia dość prostego, ale przydatnego na kolejnych etapach nauki, mianowicie komentarzy. Komentarz to tak naprawdę dowolny kawałek naszego kodu, który nie zostanie uwzględniony w programie. Komentarze mogą służyć do zostawienia krótkiej informacji dla innych programistów lub czasami &amp;ldquo;wyłączenia&amp;rdquo; kawałka kodu, w trakcie pisania i testowania naszego programu.&lt;/p&gt;&#xA;&lt;p&gt;Wyróżniamy trzy rodzaje komentarzy:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;liniowe - od znaków // do końca linii&lt;/li&gt;&#xA;&lt;li&gt;blokowe - wszystko pomiędzy znakami /* i */&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Javadoc&lt;/strong&gt; - służy do tworzenia dokumentacji&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Poniżej przykład użycia w kodzie takich komentarzy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * To jest Javadoc &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; * dla klasy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt; */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/**&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * Tutaj Javadoc &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * dla funkcji&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// Tutaj jest komentarz liniowy&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;/*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;        To jest komentarz blokowy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;        Może on mieć wiele linii&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;         */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Komentarzy będziemy używać w przykładach kodu w celu wyjaśnienia niektórych instrukcji. Więcej o komentarzach możemy poczytać tutaj: &lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/articles/java/index-137868.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.oracle.com/technetwork/articles/java/index-137868.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;zmienne&#34;&gt;Zmienne&#xA;&lt;/h1&gt;&lt;p&gt;W poprzednim programie wczytywaliśmy od użytkownika jego imię i nazwisko, a następnie wyświetlaliśmy te informacje. Nasz program wyglądał mniej więcej tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Scanner scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Proszę podaj swoje imię:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String forename &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Proszę podaj swoje nazwisko:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String surname &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; forename &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; surname);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Aby taki program mógł zadziałać, musieliśmy w jakiś sposób zapamiętać sobie naszą wartość, czyli imię i nazwisko użytkownika. Potrzebujemy do tego czegoś w rodzaju &amp;ldquo;pudełka&amp;rdquo; na dane, gdzie będziemy mogli w każdej chwili coś włożyć, a potem pobrać i w razie potrzeby włożyć coś innego. Takie &amp;ldquo;pudełka&amp;rdquo; na dane w językach programowania nazywamy &lt;strong&gt;zmiennymi&lt;/strong&gt; (ang. variable).&lt;/p&gt;&#xA;&lt;p&gt;W naszym kodzie z wyzwania stworzyliśmy dwie zmienne, &lt;em&gt;forename&lt;/em&gt; i &lt;em&gt;surname&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String forename &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String surname &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nazwa zmiennej musi się zaczynać literą oraz może składać się z liter i cyfr. Za &amp;ldquo;literę&amp;rdquo; w Javie traktujemy dowolny znak Unicode (&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Unikod%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://pl.wikipedia.org/wiki/Unikod)&lt;/a&gt;, w tym także polskie znaki potocznie nazywane literami z ogonkami jak np. &amp;ldquo;ą&amp;rdquo;. Przyjęto jednak zwyczajowo, że nasze &lt;strong&gt;programy piszemy w języku angielskim&lt;/strong&gt;, ułatwia to współpracę z programistami z całego świata oraz unikamy problemów z kodowaniem.&lt;/p&gt;&#xA;&lt;p&gt;W nazwach zmiennych możemy używać zarówno dużych i małych liter, trzeba jednak pamiętać, że wielkość liter ma znaczenie i zmienna &lt;em&gt;forename&lt;/em&gt;, &lt;em&gt;Forename&lt;/em&gt; czy &lt;em&gt;foreName&lt;/em&gt; to zupełnie inne zmienne. Przyjęto, że w Javie stosujemy notację &lt;strong&gt;camelCase&lt;/strong&gt; (&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/CamelCase%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://pl.wikipedia.org/wiki/CamelCase)&lt;/a&gt;, czyli nazwy zmiennych zaczynamy zawsze małą literą, zaś w przypadku nazw będących złożeniem kilku słów, każde kolejne słowo zaczyna się dużą literą, np. &lt;em&gt;myDogName&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Dodatkowo nie można stosować w nazwach symboli taki jak &amp;ldquo;+&amp;rdquo;, spacji oraz słów zarezerwowanych (&lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Więcej o &amp;ldquo;zwyczajach&amp;rdquo; stosowanych w języku Java, czyli tak zwanych &lt;em&gt;konwencjach&lt;/em&gt;, możemy przeczytać tutaj: &lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/java/codeconventions-150003.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.oracle.com/technetwork/java/codeconventions-150003.pdf&lt;/a&gt;. Oczywiście nie ma obowiązku ich przestrzegania, jest to jednak mocno zalecane i ułatwia współpracę z innymi programistami. Zdarza się także, że różne firmy tworzą własne reguły pisania kodu, gdybyśmy chcieli zobaczyć jak robi to firma Google wystarczy zajrzeć na stronę: &lt;a class=&#34;link&#34; href=&#34;https://google.github.io/styleguide/javaguide.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://google.github.io/styleguide/javaguide.html&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;typy-danych&#34;&gt;Typy danych&#xA;&lt;/h1&gt;&lt;p&gt;Java jest językiem o &lt;strong&gt;ścisłej kontroli typów&lt;/strong&gt; (&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Typowanie_statyczne%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://pl.wikipedia.org/wiki/Typowanie_statyczne)&lt;/a&gt;. Oznacza to, że każda zmienna ma z góry określony typ, czyli informację o tym co można do takiej zmiennej zapisać. Typy dzielimy na proste (ang. primitive) oraz złożone, czyli obiekty o których powiemy sobie więcej w kolejnych wyzwaniach.&lt;/p&gt;&#xA;&lt;p&gt;Do typów prostych zaliczamy:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;byte - przechowuje liczby całkowite z zakresu od -128 do 127&lt;/li&gt;&#xA;&lt;li&gt;short - przechowuje liczby całkowite z zakresu od -32 768 do 32 767&lt;/li&gt;&#xA;&lt;li&gt;int - przechowuje liczby całkowite z zakresu -2&lt;!-- raw HTML omitted --&gt;31&lt;!-- raw HTML omitted --&gt; do 2&lt;!-- raw HTML omitted --&gt;31&lt;!-- raw HTML omitted --&gt;-1&lt;/li&gt;&#xA;&lt;li&gt;long - przechowuje liczby całkowite z zakresu -2&lt;!-- raw HTML omitted --&gt;63&lt;!-- raw HTML omitted --&gt; do 2&lt;!-- raw HTML omitted --&gt;63&lt;!-- raw HTML omitted --&gt;-1&lt;/li&gt;&#xA;&lt;li&gt;float - przechowuje liczby zmiennoprzecinkowe 32 bitowe zgodne ze standardem IEEE 754&lt;/li&gt;&#xA;&lt;li&gt;double - przechowuje liczby zmiennoprzecinkowe 64 bitowe zgodne ze standardem IEEE 754&lt;/li&gt;&#xA;&lt;li&gt;boolean - przechowuje wartość logiczną (prawda lub fałsz, ang. true or false)&lt;/li&gt;&#xA;&lt;li&gt;char - przechowuje znaki (dokładnie znaki Unicode, 16-bit, 0-65,535)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Brzmi to dość skomplikowanie, ale wcale tak nie jest. Pierwsze cztery typy przechowują liczby - im większa liczba, tym &amp;ldquo;bardziej pojemny&amp;rdquo; typ musimy użyć, co oczywiście skutkuje zużyciem większego miejsca w pamięci komputera. Kolejne dwa typy, czyli &lt;em&gt;float&lt;/em&gt; i &lt;em&gt;double&lt;/em&gt; przechowują liczby niecałkowite, które nazywamy w informatyce zmiennoprzecinkowymi - im &amp;ldquo;więcej miejsc po przecinku&amp;rdquo;, tym typu o większej precyzji musimy użyć,  czyli &lt;em&gt;double&lt;/em&gt; zamiast &lt;em&gt;float&lt;/em&gt;. Typ boolean przechowuje dwa rodzaje wartości, &lt;em&gt;true&lt;/em&gt; lub &lt;em&gt;false&lt;/em&gt; i zostanie pokazany w rozdziale z warunkami. Ostatni typ służy do przechowywania pojedynczych znaków, czyli np. liter lub cyfr.&lt;/p&gt;&#xA;&lt;p&gt;Więcej informacji o typach możemy znaleźć pod adresem: &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;łańcuchy-znaków&#34;&gt;Łańcuchy znaków&#xA;&lt;/h2&gt;&lt;p&gt;W Javie nie ma wbudowanego typu prostego dla łańcucha znaków, czyli jakiegoś napisu. W zamian mamy klasę &lt;strong&gt;String&lt;/strong&gt; pozwalającą nam na przypisanie napisów. O łańcuchach powiemy sobie więcej w innym wyzwaniu, gdzie skupimy się na obsłudze dat i napisów w Javie.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład stworzenia dowolnego łańcucha:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;String text &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;To jest dowolny tekst&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;deklaracja&#34;&gt;Deklaracja&#xA;&lt;/h2&gt;&lt;p&gt;Zmienne w języku Java trzeba &lt;em&gt;deklarować&lt;/em&gt;, czyli podać typ oraz nazwę zmiennej, np:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; days;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; miliseconds;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; avg;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; money;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; success;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; character;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Możemy też zadeklarować kilka zmiennych razem, gdy są tego samego typu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; days, months;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ale nie jest to zalecane, gdyż utrudnia czytanie programów.&lt;/p&gt;&#xA;&lt;h2 id=&#34;inicjalizacja&#34;&gt;Inicjalizacja&#xA;&lt;/h2&gt;&lt;p&gt;Zmiennych które są tylko zadeklarowane nie możemy użyć, dlatego trzeba najpierw je &lt;em&gt;zainicjalizować&lt;/em&gt;, czyli przypisać im jakąś wartość początkową:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;days &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;miliseconds &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1212312807128L;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;avg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 4.&lt;span style=&#34;color:#a6e22e&#34;&gt;5f&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;money &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 50.&lt;span style=&#34;color:#a6e22e&#34;&gt;6&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;success &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;character &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Najlepiej jest jednak deklarować zmienne i je inicjalizować w tej samej linijce jak poniżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; days &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;long&lt;/span&gt; miliseconds &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1212312807128L;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; avg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 4.&lt;span style=&#34;color:#a6e22e&#34;&gt;5f&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; money &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 50.&lt;span style=&#34;color:#a6e22e&#34;&gt;6&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; success &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; character &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli nie jest to możliwe, należy deklarację napisać jak najbliżej w kodzie miejsca inicjalizacji, kod będzie łatwiejszy do analizowania.&lt;/p&gt;&#xA;&lt;p&gt;W powyższym przykładzie powiedzieliśmy kompilatorowi, że nasza zmienna &lt;em&gt;days&lt;/em&gt; ma mieć na początku wartość równą 5, zaś &lt;em&gt;money&lt;/em&gt; wartość równą 50.6. Liczbę 5 oraz 50.6 w tym przypadku nazywamy &lt;em&gt;literałem&lt;/em&gt; (ang. literal), czyli konkretną wartością zapisaną w naszym kodzie. Należy zauważyć, że literały w Javie domyślnie są typu &lt;em&gt;int&lt;/em&gt; oraz &lt;em&gt;double&lt;/em&gt; dlatego w przypadku literałów typu &lt;em&gt;long&lt;/em&gt; i &lt;em&gt;float&lt;/em&gt; pojawiły się odpowiednio litery &lt;em&gt;L&lt;/em&gt; oraz &lt;em&gt;f&lt;/em&gt;. Więcej przykładów takich literałów możemy znaleźć w dokumentacji na stronie: &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;słowo-var&#34;&gt;Słowo var&#xA;&lt;/h2&gt;&lt;p&gt;W starszych wersjach języka Java zawsze musieliśmy podawać typ zmiennej. Od wersji 10 języka nie musimy tego robić, możemy pozwolić by kompilator domyślił się tego za nas. Korzystamy wtedy ze słówka &lt;strong&gt;var&lt;/strong&gt; będącego skrótem słowa &lt;em&gt;variable&lt;/em&gt; czyli &lt;em&gt;zmienna&lt;/em&gt;. Powyższy fragment kodu możemy w takim razie zapisać jako:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; days &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; money &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 50.&lt;span style=&#34;color:#a6e22e&#34;&gt;6&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W kolejnych przykładach kodu, będziemy na przemian korzystać ze słówka &lt;em&gt;var&lt;/em&gt; lub deklaracji typu zmiennej, by przyzwyczaić się do obydwu możliwości.&lt;/p&gt;&#xA;&lt;h1 id=&#34;stałe&#34;&gt;Stałe&#xA;&lt;/h1&gt;&lt;p&gt;Wartość przechowywaną w zmiennej w każdej chwili możemy zmienić na inną (stąd też nazwa zmienna). Jednak czasami potrzebujemy powiedzieć kompilatorowi oraz innym programistom, że coś ma być &amp;ldquo;stałe&amp;rdquo;. Wtedy warto skorzystać ze słówka &lt;strong&gt;final&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Poniższy kod jest prawidłowy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; days &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;days &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;zaś poniższy już nie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; days &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;days &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10; &lt;span style=&#34;color:#75715e&#34;&gt;// tutaj będzie błąd!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;operatory&#34;&gt;Operatory&#xA;&lt;/h1&gt;&lt;p&gt;Na zmiennych możemy wykonywać różne operacje, np. arytmetyczne. Robimy to za pomocą operatorów.&lt;/p&gt;&#xA;&lt;p&gt;Podstawowymi operatorami są znaki &amp;ldquo;+&amp;rdquo;, &amp;ldquo;-&amp;rdquo;, &amp;ldquo;*&amp;rdquo;, &amp;ldquo;/&amp;rdquo; oraz &amp;ldquo;%&amp;rdquo; oznaczające operację odpowiednio dodawania, odejmowania, mnożenia, dzielenia oraz modulo (reszta z dzielenia). Także znak &amp;ldquo;=&amp;rdquo; jest tak zwanym operatorem przypisania. Poniżej przykład użycia tych operatorów:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(result);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(result);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(result);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(result);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(result);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Czasami chcemy zwiększyć wartość naszej zmiennej bez konieczności zapisywania wyniku w innej zmiennej jak poniżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wolimy wtedy napisać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Można to jednak jeszcze bardziej uprościć używając operatorów &amp;ldquo;+=&amp;rdquo;, &amp;ldquo;-=&amp;rdquo;, &amp;ldquo;*=&amp;rdquo;, &amp;ldquo;/=&amp;rdquo;. Dzięki nim zamiast pisać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;możemy napisać zwięźlej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;-=&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x &lt;span style=&#34;color:#f92672&#34;&gt;/=&lt;/span&gt; y;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zauważmy, że w obydwu przypadkach przy każdym działaniu zmieniamy wartość zmiennej &amp;ldquo;x&amp;rdquo;, dlatego wyniki będą inne, niż gdy korzystaliśmy ze zmiennej &amp;ldquo;result&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Innymi przydatnymi i często używanymi operatorami są operatory inkrementacji &amp;ldquo;++&amp;rdquo; i dekrementacji &amp;ldquo;&amp;ndash;&amp;rdquo; czyli zwiększenia i zmniejszenia zmiennej o wartość równą jeden. Poniżej krótki przykład użycia tych operatorów:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Możemy także zapisać je tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Niestety po uruchomieniu powyższego programu wyniki, które zobaczymy w terminalu mogą się różnić od tych, których byśmy się spodziewali. Dzieje się tak dlatego, że nasze zmienne zostaną najpierw przekazane do funkcji &lt;em&gt;println&lt;/em&gt; i wyświetlone, a dopiero potem zostaną zastosowane operatory &amp;ldquo;++&amp;rdquo; i &amp;ldquo;&amp;ndash;&amp;rdquo;. Gdybyśmy chcieli najpierw wykonać operacje inkrementacji i dekrementacji powinniśmy użyć tych operatorów z lewej strony zmiennej, co będzie oznaczało dla kompilatora &amp;ldquo;najpierw zwiększ, potem wyślij do funkcji println&amp;rdquo;. Poniżej przykład:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ostatnimi podstawowymi i często używanymi operatorami są operator równości &amp;ldquo;==&amp;rdquo;, operator nierówności &amp;ldquo;!=&amp;rdquo; i cztery operatory większości &amp;ldquo;&amp;gt;&amp;rdquo;, &amp;ldquo;&amp;lt;&amp;rdquo;, &amp;ldquo;&amp;gt;=&amp;rdquo;, &amp;ldquo;&amp;lt;=&amp;rdquo;, pozwalające sprawdzić czy wartości dwóch zmiennych są równe, czy nie oraz która wartość jest większa. Operatory te zwracają prawdę (true) lub fałsz (false) czyli zmienną typu boolean. Poniżej przykład użycia tych operatorów:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; y); &lt;span style=&#34;color:#75715e&#34;&gt;// czy x jest równe y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; y); &lt;span style=&#34;color:#75715e&#34;&gt;// czy x jest różne od y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; y); &lt;span style=&#34;color:#75715e&#34;&gt;// czy x jest większe od y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; y); &lt;span style=&#34;color:#75715e&#34;&gt;// czy x jest większe lub równe y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y); &lt;span style=&#34;color:#75715e&#34;&gt;// czy x jest mniejsze od y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; y); &lt;span style=&#34;color:#75715e&#34;&gt;// czy x jest mniejsze lub równe y&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Należy pamiętać, że operatory równości działają dla typów prostych. Dla typów złożonych, o których powiemy sobie w kolejnym wyzwaniu, mają zupełnie inne zastosowanie niż &amp;ldquo;porównanie wartości&amp;rdquo;. Jest to bardzo ważne, by o tym pamiętać. Dla przykładu takim typem złożonym jest poznany wcześniej &lt;em&gt;String&lt;/em&gt; czyli łańcuch znaków. Jeśli chcemy porównać dwa łańcuchy, musimy użyć funkcji &lt;strong&gt;equals&lt;/strong&gt;. Poniżej przykład porównania dwóch napisów:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String text &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;To jest dowolny tekst&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; otherText &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;To jest inny tekst&amp;#34;&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(text.&lt;span style=&#34;color:#a6e22e&#34;&gt;equals&lt;/span&gt;(otherText)); &lt;span style=&#34;color:#75715e&#34;&gt;// Zwróci false, gdyż napisy są różne&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Operatory te są używane przede wszystkim w instrukcjach sterujących (patrz dalej).&lt;/p&gt;&#xA;&lt;p&gt;Więcej operatorów możemy znaleźć pod adresem: &lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html&lt;/a&gt;. Zamieszczona tam tabela nie tylko pokazuje wszystkie dostępne operatory w języku Java, ale także odzwierciedla kolejność wykonywania operacji gdy w jednej linijce kodu użyjemy kilku operatorów, podobnie jak w szkole podstawowej na lekcjach matematyki słuchaliśmy o kolejności wykonywania działań matematycznych. Tak samo jak na matematyce, w Javie także można się wspomagać nawiasami, gdy domyślna kolejność nam nie odpowiada.&lt;/p&gt;&#xA;&lt;h1 id=&#34;instrukcje-warunkowe&#34;&gt;Instrukcje warunkowe&#xA;&lt;/h1&gt;&lt;p&gt;W Javie, podobnie jak w większości języków programowania, działaniem naszego programu sterujemy za pomocą instrukcji warunkowych. Do budowania tych instrukcji korzystamy ze słówka kluczowego &lt;strong&gt;if&lt;/strong&gt; oraz &lt;strong&gt;else&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;W najprostszej postaci instrukcja warunkowa wygląda tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (warunek) polecenie;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli chcemy dla danego warunku wykonać kilka instrukcji musimy użyć nawiasów { }:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (warunek) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    instrukcja 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    instrukcja 2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Instrukcje wewnątrz nawiasów { } nazywamy &lt;em&gt;blokiem&lt;/em&gt; instrukcji.&lt;/p&gt;&#xA;&lt;p&gt;Gotowy kod Java może więc wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; y){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x jest większe od y&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Funkcja &lt;em&gt;println&lt;/em&gt; zostanie wykonana tylko i wyłącznie wtedy, gdy wartość zmiennej x będzie większa od y (co w tym przypadku jest prawdą).&lt;/p&gt;&#xA;&lt;p&gt;Jeśli chcemy wykonać jakąś akcję gdy warunek nie zostanie spełniony możemy użyć słowa kluczowego &lt;strong&gt;else&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; y){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x jest większe od y&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x nie jest większe od y&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Instrukcję &lt;strong&gt;if&lt;/strong&gt; można łączyć ze sobą robiąc kaskadę warunków:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 10;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 5;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; y){&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x jest większe od y&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; y) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x jest mniejsze od y&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;x jest równe y&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;pętle&#34;&gt;Pętle&#xA;&lt;/h1&gt;&lt;p&gt;Innym mechanizmem sterowania pracą naszego programu są pętle. Pozwalają one na wykonanie wielokrotnie jakiejś operacji. W składni języka mamy dostępne trzy rodzaje pętli: &lt;strong&gt;while&lt;/strong&gt;, &lt;strong&gt;do-while&lt;/strong&gt; oraz &lt;strong&gt;for&lt;/strong&gt;, która jest dostępna w dwóch wariantach.&lt;/p&gt;&#xA;&lt;p&gt;Pętla &lt;strong&gt;while&lt;/strong&gt; służy do wykonywania jakiejś instrukcji dopóki spełniony jest warunek:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (warunek) instrukcja&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tak samo jak w przypadku instrukcji warunkowych możemy w pętli wykonywać całe bloki kodu dzięki nawiasom { }.&lt;/p&gt;&#xA;&lt;p&gt;Poniższy program pobiera od użytkownika liczbę dopóki jej wartość nie będzie większa od 100:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Scanner scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Podaj proszę liczbę większą od 100:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; number &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextDouble&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (number &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; 100) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Liczba nie jest większa od 100, podaj jeszcze raz:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            number &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextDouble&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dziękuję! Podałeś liczbę: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; number);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli zmienna &lt;em&gt;number&lt;/em&gt; już za pierwszym razem zostanie podana prawidłowa, nasza pętla nigdy się nie wykona, gdyż najpierw jest sprawdzany warunek.&lt;/p&gt;&#xA;&lt;p&gt;Pętla &lt;strong&gt;do-while&lt;/strong&gt; działa bardzo podobnie do *&lt;em&gt;while&lt;/em&gt;, jednak w tym przypadku najpierw wykonujemy blok kodu, a dopiero potem sprawdzamy warunek. Nasz program z użyciem pętli &lt;strong&gt;do-while&lt;/strong&gt; będzie wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Scanner scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;double&lt;/span&gt; number;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Podaj proszę liczbę większą od 100:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            number &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextDouble&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        } &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (number &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; 100);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dziękuję! Podałeś liczbę: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; number);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pętla &lt;strong&gt;for&lt;/strong&gt; służy do wykonania jakiejś instrukcji określoną liczbę razy. Jej składnia wygląda następująco:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ( inicjalizacja zmiennych pomocniczych; warunek ; zmiana wartości zmiennych pomocniczych)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    instrukcja&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wyobraźmy sobie, że chcemy wyświetlić wszystkie liczby od 1 do 10. Nasz program z użyciem pętli while wyglądałby tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; (i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; 10) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;zaś w przypadku pętli &lt;strong&gt;for&lt;/strong&gt; tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 1; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; 10; i&lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(i);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak widać na dwóch powyższych przykładach, obydwu pętli można stosować zamiennie w zależności od tego, której w danym momencie jest nam łatwiej użyć!&lt;/p&gt;&#xA;&lt;p&gt;Pętla &lt;strong&gt;for&lt;/strong&gt; ma jeszcze drugą wersję, tak zwany &lt;strong&gt;foreach&lt;/strong&gt;, ale do tego przypadku wrócimy gdy poznamy tablice i kolekcje w Javie.&lt;/p&gt;&#xA;&lt;h1 id=&#34;wyzwanie&#34;&gt;Wyzwanie&#xA;&lt;/h1&gt;&lt;p&gt;Nasze drugie wyzwanie będzie bardziej wymagające od poprzedniego. Chcemy byście napisali uproszczoną wersję kalkulatora! Uproszczoną dlatego, że nie będziemy mieć okienka z przyciskami, liczby jak i polecenia będziemy podawać w terminalu, np. tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Proszę podaj w oddzielnych linijkach jakąś liczbę, operację matematyczną +,-,*,/,%, a następnie kolejną liczbę:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;12&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Twój wynik to: &lt;span style=&#34;color:#ae81ff&#34;&gt;15&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Chcesz wykonać kolejne działanie? Wpisz literę t lub n.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/java/codeconventions-150003.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.oracle.com/technetwork/java/codeconventions-150003.pdf&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/articles/java/index-137868.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.oracle.com/technetwork/articles/java/index-137868.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Wprowadzenie do świata języka Java</title>
            <link>https://bigdatapassion.pl/blog/wprowadzenie-do-%C5%9Bwiata-j%C4%99zyka-java/</link>
            <pubDate>Fri, 20 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wprowadzenie-do-%C5%9Bwiata-j%C4%99zyka-java/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/java/java-coffee-cup.jpg&#34; alt=&#34;Featured image of post Wprowadzenie do świata języka Java&#34; /&gt;&lt;p&gt;Wiele początkujących osób zadaje sobie pytanie:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Jaki język programowania wybrać na początek i dlaczego?&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;W tym poście spróbuję odpowiedzieć dość szeroko na to pytanie :)&lt;/p&gt;&#xA;&lt;h1 id=&#34;języki-programowania&#34;&gt;Języki programowania&#xA;&lt;/h1&gt;&lt;p&gt;Programowanie to tak naprawdę rozmowa z komputerem, przekazywanie mu naszych poleceń, które on będzie wykonywać. Jednak do tego potrzebny jest odpowiedni język, który maszyna, czytaj komputer, zrozumie. Takich języków powstało naprawdę wiele. Niektóre są proste i łatwe, inne znowu wyrafinowane i zarazem skomplikowane. Każdy z języków ma swoje zalety i wady, stąd jest ich tak wiele - by można było wybrać taki, który najbardziej będzie się nadawał do naszego zadania lub taki, który będzie dla nas bardziej przyjazny.&lt;/p&gt;&#xA;&lt;p&gt;Trzeba też pamiętać, że nie każdy język programowania służy do tego samego. Języki takie jak HTML, CSS czy JavaScript (nie mylić z Javą!) służą przede wszystkim do tworzenia stron internetowych i są zrozumiałe dla przeglądarek internetowych takich jak Firefox, Chrome czy Edge. Z drugiej strony bardzo popularny język SQL (ang. Structured Query Language) jest językiem służącym do komunikacji z bazami danych, czyli programami służącymi do przechowywania informacji zgodnie z określonymi regułami. Język PHP jest bardzo popularny w zastosowaniach serwerowych służących do generowania dynamicznie naszych stron internetowych (w przeciwieństwie do HTML, CSS i Javascript nie działa po stronie przeglądarki internetowej tylko serwera). Języki takie jak C, C++ czy C# bardzo często używane są do tworzenia aplikacji okienkowych, najprawdopodobniej większość waszych aplikacji zainstalowanych w komputerze jest stworzona w oparciu o te języki programowania. Oczywiście to tylko przykłady, języków programowania jest dużo więcej oraz ich zastosowania bywają szersze niż wskazane powyżej.&lt;/p&gt;&#xA;&lt;h1 id=&#34;język-java&#34;&gt;Język Java&#xA;&lt;/h1&gt;&lt;p&gt;My zachęcamy Was do rozpoczęcia swojej przygody w językiem Java. Jest to obecnie jeden z popularniejszych języków programowania, bardzo wszechstronny i zarazem wydajny.&lt;/p&gt;&#xA;&lt;h2 id=&#34;historia&#34;&gt;Historia&#xA;&lt;/h2&gt;&lt;p&gt;Prace nad stworzeniem języka Java rozpoczęły się już w 1991 roku. Autorami projektu byli James Gosling, Mike Sheridan, i Patrick Naughton. Początkowo język nazywał się &lt;em&gt;Oak&lt;/em&gt; po drzewie o tej samej nazwie, co w języku polskim oznacza Dąb. Inspiracja pochodziła od drzewa, które rosło obok gabinetu James&amp;rsquo;a Gosling&amp;rsquo;a, uznawanego obecnie za ojca języka Java. Sam projekt, w ramach którego powstał ten język, nosił kryptonim &lt;em&gt;Green&lt;/em&gt;. Następnie z powodu zastrzeżenia nazwy przez Oak Technologies, język zyskał nazwę &lt;strong&gt;Java&lt;/strong&gt; pochodzącą od kawy z wyspy Jawa w Indonezji (ang. Java coffee, &lt;a class=&#34;link&#34; href=&#34;https://www.javaworld.com/article/2077265/core-java/so-why-did-they-decide-to-call-it-java-.html%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.javaworld.com/article/2077265/core-java/so-why-did-they-decide-to-call-it-java-.html)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Informacja o stworzeniu języka Java została podana publicznie 23 maja 1995 roku, zaś pierwsza wersja do ściągnięcia ukazała się 23 stycznia 1996 roku (&lt;a class=&#34;link&#34; href=&#34;http://oracle.com.edgesuite.net/timeline/java/%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://oracle.com.edgesuite.net/timeline/java/)&lt;/a&gt;. Obecnie najnowsza wersja języka Java opatrzona jest numerem 10 i została wydana 20 marca 2018 roku, zaś kolejne mają ukazywać się co pół roku.&lt;/p&gt;&#xA;&lt;p&gt;Za powstaniem języka Java stoi firma Sun Microsystems (skrót od Stanford University Network), producent sprzętu i oprogramowania komputerowego oraz rozwiązań sieciowych. 27 stycznia 2010 roku Sun został przejęty przez firmę Oracle, która jest drugim na świecie, po firmie Microsoft, sprzedawcą oprogramowania (&lt;a class=&#34;link&#34; href=&#34;https://www.pwc.com/gx/en/industries/technology/publications/global-100-software-leaders/explore-the-data.html%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.pwc.com/gx/en/industries/technology/publications/global-100-software-leaders/explore-the-data.html)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cechy-języka-java&#34;&gt;Cechy języka Java&#xA;&lt;/h2&gt;&lt;p&gt;Składnia języka Java bazuje na jednym z najpopularniejszych w tamtych czasach języku programowania jakim był C++, dzięki czemu była bardzo łatwa do nauki dla dużego grona programistów oraz była od razu językiem obiektowym. Jednak w przeciwieństwie do języka C++, Java miała być dużo łatwiejsza do tworzenia oprogramowania, przez co miała skrócić czas niezbędny na napisanie programu. Osiągnięto to przede wszystkim przez wprowadzenie prostszego i automatycznego zarządzania pamięcią. Programiści nie muszą już samodzielnie zwalniać pamięci dzięki wprowadzeniu narzędzia zwanego &lt;em&gt;Garbage Collector&lt;/em&gt; oraz nie mają możliwości korzystania ze wskaźników do pamięci operacyjnej, które sprzyjały nadpisywaniu trzymanych tam informacji, a tym samym awariom programu czy utratom danych. W języku Java wprowadzono także wiele uproszczeń w składni względem języka C++. Celem twórców było stworzenie języka, który miał być prostszą wersją języka C++ z zachowaniem wszystkich zalet takich jak np. bardzo duża wydajność.&lt;/p&gt;&#xA;&lt;p&gt;Początkowo Java miała być wykorzystywana do tworzenia oprogramowania dla urządzeń telewizyjnych, gdzie wcześniej używany był głównie język C++. Niestety wymagało to często tworzenia dedykowanego kodu na każde urządzenie, dlatego główną ideą, która przyświecała twórcom Javy, była &amp;ldquo;Write Once, Run Anywhere&amp;rdquo;, czyli napisz raz swój program i uruchamiaj gdziekolwiek. Tak powstała maszyna wirtualna Java umożliwiająca uruchamianie wszędzie tego samego kodu napisanego w języku Java. Możliwość uruchamiania programów na wielu systemach i urządzeniach nazywamy także multiplatformowością.&lt;/p&gt;&#xA;&lt;p&gt;Trzecią ważną ideą, która przyświecała twórcom języka Java, poza automatycznym zarządzaniem pamięcią oraz uruchamianiem tego samego programu na wielu platformach, miała być uniwersalność języka. Java miała się stać językiem wszechstronnym, w którym można pisać aplikacje okienkowe, serwerowe, internetowe, mobilne oraz w dalszym ciągu umożliwiać tworzenie oprogramowania dla urządzeń, tak zwanych systemów wbudowanych (&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/System_wbudowany%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://pl.wikipedia.org/wiki/System_wbudowany)&lt;/a&gt;. Java jest również językiem, który sprzyja wykorzystaniu go w warunkach sieciowych dzięki dużemu bezpieczeństwu i wbudowanym mechanizmom obsługi komunikacji sieciowej.&lt;/p&gt;&#xA;&lt;h2 id=&#34;popularność&#34;&gt;Popularność&#xA;&lt;/h2&gt;&lt;p&gt;W internecie bardzo łatwo znaleźć serwisy, które za pomocą wielu różnych metod próbują oszacować popularność języków programowania. Do najpopularniejszych należą:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.tiobe.com/tiobe-index/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.tiobe.com/tiobe-index/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://insights.stackoverflow.com/survey/2018/#technology-programming-scripting-and-markup-languages&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://insights.stackoverflow.com/survey/2018/#technology-programming-scripting-and-markup-languages&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://octoverse.github.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://octoverse.github.com/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://pypl.github.io/PYPL.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://pypl.github.io/PYPL.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Jak widać z powyższych statystyk, Java jest czołowym językiem programowania wykorzystywanym od lat.&lt;/p&gt;&#xA;&lt;h2 id=&#34;zastosowania&#34;&gt;Zastosowania&#xA;&lt;/h2&gt;&lt;p&gt;O popularności języka Javy zdecydowała w dużej mierze jego wszechstronność. Możemy z jego pomocą tworzyć aplikacje okienkowe, serwerowe, mobilne (np. na systemie Android), a nawet spotkać programy napisane w tym języku w urządzeniach takich jak telewizory, odtwarzacze Blu-Ray czy karty chipowe.&lt;/p&gt;&#xA;&lt;h2 id=&#34;wydajność&#34;&gt;Wydajność&#xA;&lt;/h2&gt;&lt;p&gt;Język Java dzięki wielu optymalizacjom jest jednym z wydajniejszych języków programowania o czym możemy się przekonać analizując wyniki testów zamieszczonych na stronie: &lt;a class=&#34;link&#34; href=&#34;https://benchmarksgame.alioth.debian.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://benchmarksgame.alioth.debian.org/&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;możliwości&#34;&gt;Możliwości&#xA;&lt;/h2&gt;&lt;p&gt;Język Java oferuje wiele możliwości swoim użytkownikom. Jest przede wszystkim językiem obiektowym, ale od wersji 8 języka Java możemy także programować w nim funkcyjnie. O obiektowości i funkcyjności języka Java będziemy mówić w oddzielnych wyzwaniach. Java jest też językiem wielowątkowym, czyli takim który umożliwia wykonywanie wielu poleceń na raz (równolegle na wielu rdzeniach procesora).&lt;/p&gt;&#xA;&lt;h2 id=&#34;wirtualna-maszyna-java&#34;&gt;Wirtualna maszyna Java&#xA;&lt;/h2&gt;&lt;p&gt;Java to język programowania. To już wiemy. Ale to nie wszystko. Java to także &lt;em&gt;wirtualna maszyna Java&lt;/em&gt; (ang. Java Virtual Machine, w skrócie JVM) na której możemy uruchamiać programy napisane w języku Java i nie tylko w tym języku! Obecnie na JVM można uruchamiać wiele innych języków. Do najpopularniejszych z nich należą: Scala, Kotlin, Groovy, Clojure oraz języki, które nie powstały z myślą o pracy w wirtualnej maszynie Java, lecz zostały później zaadaptowane jak np. Ruby (JRuby), Python (Jython).&lt;/p&gt;&#xA;&lt;h2 id=&#34;platforma-java&#34;&gt;Platforma Java&#xA;&lt;/h2&gt;&lt;p&gt;Oprócz języków programowania i maszyny wirtualnej, często mówimy także o &amp;ldquo;platformach&amp;rdquo; dostępnych dla środowiska Java. Do tych platform należą:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Java Standard Edition (Java SE) - aplikacje uruchamiane w konsoli lub aplikacje okienkowe&lt;/li&gt;&#xA;&lt;li&gt;Java Enterprise Edition (Java EE) - aplikacje serwerowe&lt;/li&gt;&#xA;&lt;li&gt;Java Micro Edition (Java ME) - aplikacje mobilne lub działające na urządzeniach o niskiej wydajności&lt;/li&gt;&#xA;&lt;li&gt;Java FX - aplikacje RIA (rich internet applications) oraz aplikacje okienkowe&lt;/li&gt;&#xA;&lt;li&gt;Java Card - mikro aplikacje uruchamiane na kartach elektronicznych&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Platforma Java to tak naprawdę zbiór bibliotek i narzędzi umożliwiających lub ułatwiających tworzenie oprogramowania dla konkretnych zastosowań, np. aplikacje serwerowe w Java EE.&lt;/p&gt;&#xA;&lt;p&gt;Java oraz Kotlin są także językami używanymi do pisania aplikacji mobilnych na systemie Android tworzonego przez firmę Google (&lt;a class=&#34;link&#34; href=&#34;https://developer.android.com/samples/index.html%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://developer.android.com/samples/index.html)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;społeczność&#34;&gt;Społeczność&#xA;&lt;/h2&gt;&lt;p&gt;Java to również, a może przede wszystkim, olbrzymia społeczność programistów z całego świata, którzy nie tylko pomagają sobie wzajemnie, ale także dzielą się swoim oprogramowaniem na zasadach Open Source, czyli otwartego kodu. Najpopularniejsze biblioteki i narzędzia tworzone są przez fundację Apache (&lt;a class=&#34;link&#34; href=&#34;http://www.apache.org/%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.apache.org/)&lt;/a&gt;. Wiele też firm tworzy swoje oprogramowanie i udostępnia je innym firmom i programistom za darmo lub na podstawie płatnych licencji. Jednym z najpopularniejszych portali gdzie możemy znaleźć ogromną ilość oprogramowania i bibliotek napisanych w języku Java (oraz innych używanych na JVM), dostępnych na zasadach otwartego kodu źródłowego, jest portal GitHub (&lt;a class=&#34;link&#34; href=&#34;https://github.com/%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Język Java, maszyna wirtualna Java oraz platformy Java są również tworzone przez społeczność. Właścicielem praw do języka Java jest firma Oracle. Mimo to, sam proces wprowadzania nowych zmian i funkcjonalności realizowany jest przez społeczność programistów i firm z całego świata w ramach procesu zwanego &lt;em&gt;Java Community Process, JCP&lt;/em&gt; (&lt;a class=&#34;link&#34; href=&#34;https://jcp.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://jcp.org&lt;/a&gt;). Listę zaangażowanych firm można znaleźć pod adresem: &lt;a class=&#34;link&#34; href=&#34;https://jcp.org/en/participation/members/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://jcp.org/en/participation/members/&lt;/a&gt;. Wśród nich możemy odnaleźć takie firmy jak Google, Hewlett Packard Enterprise, Intel Corp, Twitter, Red Hat, IBM, Fujitsu Limited oraz wiele, wiele innych. Zmiany wprowadzane są w postaci tak zwanych &lt;em&gt;Java Specification Requests, JSR&lt;/em&gt;, które podlegają ocenie i głosowaniu. Cały proces opisany jest pod adresem: &lt;a class=&#34;link&#34; href=&#34;https://jcp.org/en/procedures/overview&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://jcp.org/en/procedures/overview&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;oracle-java-vs-microsoft-net&#34;&gt;Oracle Java vs Microsoft .NET&#xA;&lt;/h2&gt;&lt;p&gt;Niewiarygodny sukces platformy Java przyczynił się także do powstania w 2002 roku konkurencyjnej platformy autorstwa firmy Microsoft zwanej platformą .NET (pełna nazwa .NET Framework). Początkowo twórcy zaimplementowali własną wersję języka Java z lekkimi modyfikacjami pod nazwą J++, zaś później stworzyli swój własny język, konkurencyjny do języka Java, który nazwali C#. Platforma firmy Microsoft była początkowo rozwijana tylko na systemy firmy Microsoft, jednak 27 czerwca 2016 roku została wydana zupełnie nowa wersja platformy .NET pod nazwą .NET Core, która w odróżnieniu od .NET Framework jest multiplatformowa (Windows, Linux, MacOS) oraz otwartoźródłowa.&lt;/p&gt;&#xA;&lt;h1 id=&#34;a-na-koniec-coś-na-poprawę-humoru-&#34;&gt;A na koniec coś na poprawę humoru :)&#xA;&lt;/h1&gt;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/kLO1djacsfg&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda:&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.javaworld.com/article/2077265/core-java/so-why-did-they-decide-to-call-it-java-.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.javaworld.com/article/2077265/core-java/so-why-did-they-decide-to-call-it-java-.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Java_%28kawa%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://pl.wikipedia.org/wiki/Java_(kawa)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Coffee_production_in_Indonesia#Java&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://en.wikipedia.org/wiki/Coffee_production_in_Indonesia#Java&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://oracle.com.edgesuite.net/timeline/java/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://oracle.com.edgesuite.net/timeline/java/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.pwc.com/gx/en/industries/technology/publications/global-100-software-leaders/explore-the-data.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.pwc.com/gx/en/industries/technology/publications/global-100-software-leaders/explore-the-data.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://benchmarksgame.alioth.debian.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://benchmarksgame.alioth.debian.org/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/cd/E19798-01/821-1770/gcrkk/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/cd/E19798-01/821-1770/gcrkk/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.apache.org/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jcp.org/en/procedures/overview&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://jcp.org/en/procedures/overview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jcp.org/en/participation/members/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://jcp.org/en/participation/members/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #1: Hello World! - rozwiązanie</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%231-hello-world-rozwi%C4%85zanie/</link>
            <pubDate>Fri, 20 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%231-hello-world-rozwi%C4%85zanie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-1-solution.png&#34; alt=&#34;Featured image of post Wyzwanie Java #1: Hello World! - rozwiązanie&#34; /&gt;&lt;p&gt;W poprzednim wyzwaniu poprosiliśmy Was o napisanie programu, który wyświetla prośbę o podanie imienia i następnie nazwiska, pobiera te dwa napisy od użytkownika, a następnie wyświetla obydwa jak w przykładzie poniżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Proszę podaj swoje imię:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Jan&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Proszę podaj swoje nazwisko:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Kowalski&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Witaj Jan Kowalski&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W poście na FB z rozwiązaniami zamieściliście już kilkadziesiąt rozwiązań. Wierzymy, że osób które przystąpiły do wyzwania jest jeszcze więcej. Tych którzy jeszcze nie zmierzyli się z naszym zadaniem zachęcamy by to jeszcze zrobili w ten weekend!&lt;/p&gt;&#xA;&lt;p&gt;Wszystkie rozwiązania były prawidłowe, choć kod od siebie się różnił, co pokazuje pewną wspaniałą rzecz w programowaniu, często ten sam problem możemy rozwiązać na wiele różnych sposobów i wszystkie będą prawidłowe!&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykładowe i zarazem najpopularniejsze rozwiązanie wyzwania:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Scanner scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Proszę podaj swoje imię:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String forename &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Proszę podaj swoje nazwisko:&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String surname &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; forename &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; surname);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kolejne wyzwanie w poniedziałek 23 kwietnia o 10:00. Podwyższamy poprzeczkę i wprowadzimy sporo nowych rzeczy związanych z językiem Java, w tym nowości z JDK 10! Zaplanujcie sobie trochę wolnego czasu na przyszły tydzień na nasze wyzwanie :)&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Wyzwanie Java #1: Hello World!</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-java-%231-hello-world/</link>
            <pubDate>Mon, 16 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-java-%231-hello-world/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-challenge-1.png&#34; alt=&#34;Featured image of post Wyzwanie Java #1: Hello World!&#34; /&gt;&lt;p&gt;Jak już wiecie, chcemy Was zachęcić i zmotywować do nauki programowania! Do rozpoczęcia tej przygody potrzebny będzie nam komputer, dostęp do internetu i dużo, dużo chęci i wytrwałości :)&lt;/p&gt;&#xA;&lt;p&gt;Naszym pierwszym wyzwaniem będzie &lt;strong&gt;napisanie swojego pierwszego programu w Javie!&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;przygotujmy-się&#34;&gt;Przygotujmy się&#xA;&lt;/h1&gt;&lt;p&gt;Zanim zaczniemy cokolwiek programować musimy przygotować nasz komputer do pracy. Będziemy potrzebować na początek &lt;strong&gt;wirtualnej maszyny Java&lt;/strong&gt; (ang. Java Virtual Machine, w skrócie JVM) oraz środowiska dla programistów, tak zwane &lt;strong&gt;zintegrowane środowisko programistyczne&lt;/strong&gt; (ang. integrated development environment, w skrócie IDE).&lt;/p&gt;&#xA;&lt;h3 id=&#34;wirtualna-maszyna-java&#34;&gt;Wirtualna Maszyna Java&#xA;&lt;/h3&gt;&lt;p&gt;Java to jeden z najpopularniejszych języków programowania na świecie. Jednak  Java, to nie tylko język programowania, to także cały ekosystem technologii i języków programowania zorientowanych wokół tak zwanej wirtualnej maszyny Java, czyli środowiska uruchomieniowego, które musimy zainstalować w naszym systemie operacyjnym (np. Windows, Linux, macOS) lub innym dowolnym urządzeniu, na którym chcemy wykonywać nasze programy. Taką maszynę wirtualną znajdziemy na większości komputerach na świecie, telefonach z systemem Android czy nawet na odtwarzaczach Blu-ray. Według strony &lt;a class=&#34;link&#34; href=&#34;https://go.java/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://go.java/&lt;/a&gt; obecnie już około 15 miliardów urządzeń korzysta z Javy.&lt;/p&gt;&#xA;&lt;p&gt;Dlatego zanim zaczniemy cokolwiek robić w Javie, potrzebujemy zainstalować sobie wirtualną maszynę Java, która jest udostępniana w dwóch wersjach; Java Runtime Environment (JRE) zawierająca podstawową instalację maszyny wirtualnej wraz z dodatkowymi bibliotekami i komponentami, służącą przede wszystkim do uruchamiania programów oraz Java Development Kit (JDK) zawierająca wszystko co ma JRE plus dodatkowe narzędzia dla programistów. My oczywiście będziemy potrzebować JDK, które możemy ściągnąć ze strony: &lt;a class=&#34;link&#34; href=&#34;http://www.oracle.com/technetwork/java/javase/downloads/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.oracle.com/technetwork/java/javase/downloads/index.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Poniżej proces instalacji jdk wersji 10 na systemie Windows:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/jdk-setup.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/jdk-setup2.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/jdk-setup3.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/jdk-setup4.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/jdk-setup5.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/jdk-setup6.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;zintegrowane-środowisko-programistyczne&#34;&gt;Zintegrowane środowisko programistyczne&#xA;&lt;/h3&gt;&lt;p&gt;Programowanie w skrócie to tak naprawdę pisanie odpowiednich poleceń w wybranym języku programowania które to polecenia są następnie tłumaczone na instrukcje rozumiane przez komputer, tak zwany kod maszynowy. Tak naprawdę nasz kod, czyli zestaw tych poleceń, możemy pisać w dowolnym narzędziu, począwszy od notatnika. Takie pisanie niestety wymaga od nas dużo większego wysiłku, dlatego z pomocą przychodzą właśnie zintegrowane środowiska programistyczne, które zawierają szereg ułatwień jak podpowiadanie składki, sprawdzanie poprawności naszego programu czy łatwiejsze testowanie.&lt;/p&gt;&#xA;&lt;p&gt;Najpopularniejszymi IDE dla Javy są:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;IntelliJ IDEA &lt;a class=&#34;link&#34; href=&#34;https://www.jetbrains.com/idea/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.jetbrains.com/idea/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Eclipse &lt;a class=&#34;link&#34; href=&#34;http://www.eclipse.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.eclipse.org&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;NetBeans &lt;a class=&#34;link&#34; href=&#34;https://netbeans.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://netbeans.org&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;To które środowisko wybierzemy zależy tak naprawdę od nas, czyli naszych predyspozycji. Z naszej strony polecamy wybranie IntelliJ IDEA i z tego narzędzia będziemy korzystali w przykładach. Oczywiście wystarczy nam darmowa wersja Community.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej proces instalacji IntelliJ IDEA na systemie Windows:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-install.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-install2.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-install3.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-install4.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-install5.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-install6.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;pierwszy-program&#34;&gt;Pierwszy program&#xA;&lt;/h1&gt;&lt;p&gt;Mając już JDK i wybrane IDE możemy przystąpić do napisania swojego pierwszego programu w języku Java.&lt;/p&gt;&#xA;&lt;p&gt;Po pierwszym uruchomieniu IDEI powinniśmy zobaczyć okno z wyborem kolorystyki. Wybór według własnych preferencji.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-start2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W następnym okienku możemy wybrać różne ustawienia i dodatki - zostawmy te domyślne.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-start3.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tutaj również zostawiamy ustawienia domyślne i klikamy &amp;ldquo;Start using IntelliJ IDEA&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-start4.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Pojawia nam się okno startowe:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-start.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy opcję &amp;ldquo;Create New Project&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;W nowo otwartym oknie musimy wskazać IDEI lokalizację naszego SDK, klikamy &amp;ldquo;New&amp;rdquo; i wybieramy miejsce instalacji SDK w naszym systemie (w przypadku systemu Windows będzie to C:\Program Files\Java\jdk-10). Następnie klikamy dwukrotnie &amp;ldquo;Next&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-new-project.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym oknie musimy wpisać nazwę naszego projektu, podajemy &amp;ldquo;kodolamacz-first-challenge&amp;rdquo; i klikamy &amp;ldquo;Finish&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-project-name.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Otworzyło nam się główne okno IDEI z naszym projektem.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-new-project-created.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;To jednak tylko pusty projekt. Teraz musimy napisać swój pierwszy kawałek kodu. W tym celu rozwijamy drzewo z lewej strony z nazwą naszego projektu i na katalogu &amp;ldquo;src&amp;rdquo; klikamy prawym przyciskiem myszy i wybieramy opcję &amp;ldquo;New&amp;rdquo; a następnie &amp;ldquo;Java Class&amp;rdquo;. W nowo otwartym oknie jako nazwę wpisujemy &amp;ldquo;pl.kodolamacz.MyFirstJavaApplication&amp;rdquo; i klikamy &amp;ldquo;Ok&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/post/java/challenges/java-challenges-1-lets-start-coding/idea-new-class.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W rezultacie dostajemy poniższy kod:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Czym są klasy Java dowiemy się później, na razie potraktujmy je jako sposób organizacji kodu, czyli naszych poleceń, w świecie Java. Klasy będą się znajdować w plikach z rozszerzeniem &lt;em&gt;.java&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;W aktualnej wersji nasz kod jeszcze nic nie robi, to tylko szablon. Najprostszą operacją jaką możemy kazać wykonać komputerowi jest wyświetlenie napisu. By tego dokonać należy najpierw dodać tak zwaną metodę &lt;strong&gt;main&lt;/strong&gt; którą można uruchomić, czyli coś w rodzaju punktu startowego naszego programu. Nasz kod powinien wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Teraz możemy skorzystać z funkcji &lt;strong&gt;println&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świecie!&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Funkcja &lt;strong&gt;println&lt;/strong&gt; wyświetla dowolny ciąg znaków na tak zwanym standardowym wyjściu. Jest to jeden z możliwych sposobów komunikacji z naszym programem. Więcej o strumieniach możemy przeczytać na Wikipedii: &lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Standardowe_strumienie&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://pl.wikipedia.org/wiki/Standardowe_strumienie&lt;/a&gt;. Żeby skorzystać ze standardowego wyjścia musimy skorzystać z klasy &lt;strong&gt;System&lt;/strong&gt; służącą między innymi do obsługi standardowych strumieni w Javie. W tej klasie możemy skorzystać z pola &lt;strong&gt;out&lt;/strong&gt; gdzie mamy dostępną funkcję &lt;strong&gt;println&lt;/strong&gt;. Temat pól w klasach (ang. field) także zostanie szczegółowo omówiony w kolejnych naszych wydarzeniach.&lt;/p&gt;&#xA;&lt;p&gt;Teraz czas najwyższy by uruchomić nasz program! Klikamy w dowolnym miejscu naszego kodu prawym przyciskiem myszki i wybieramy opcję &amp;ldquo;Run &amp;lsquo;MyFirstJavaApplication&amp;hellip;.main()&amp;rsquo;&amp;rdquo; lub naciskamy kombinację klawiszy Ctrl+Shift+F10. Na dole ekranu powinniśmy zobaczyć wynik wykonania naszego programu, czyli oczekiwany napis:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Witaj świecie!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Process finished with exit code &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli napis się nie wyświetlił, trzeba sprawdzić czy wszystkie nawiasy i średniki są na swoim miejscu.&lt;/p&gt;&#xA;&lt;p&gt;Gratulacje! Udało Ci się napisać i uruchomić swój pierwszy program w języku Java. Jest to tak zwany &amp;ldquo;Hello world&amp;rdquo; (&lt;a class=&#34;link&#34; href=&#34;https://pl.wikipedia.org/wiki/Hello_world&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://pl.wikipedia.org/wiki/Hello_world&lt;/a&gt;) czyli program wyświetlający napis &amp;ldquo;Witaj świecie&amp;rdquo; i najczęściej właśnie od takiego programu zaczynamy naukę nowego lub nawet pierwszego języka programowania lub biblioteki.&lt;/p&gt;&#xA;&lt;p&gt;Jednak na tym nie skończymy. Do wyświetlenia napisu &amp;ldquo;Witaj świecie&amp;rdquo; użyliśmy standardowego wyjścia. Teraz użyjemy standardowego wejścia, żeby pobrać od użytkownika jakiś napis:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; pl.kodolamacz;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; java.util.Scanner;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;MyFirstJavaApplication&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(String&lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt; args) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świecie!&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Scanner scanner &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; Scanner(System.&lt;span style=&#34;color:#a6e22e&#34;&gt;in&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        String userString &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;nextLine&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        scanner.&lt;span style=&#34;color:#a6e22e&#34;&gt;close&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        System.&lt;span style=&#34;color:#a6e22e&#34;&gt;out&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Twój napis to: &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; userString);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wykorzystaliśmy do tego klasę &lt;strong&gt;Scanner&lt;/strong&gt; przekazując do niej standardowe wejście (System.in). W klasie Scanner mamy metodę &lt;strong&gt;nextLine()&lt;/strong&gt; która pozwala nam odczytać linijkę tekstu wpisanego przez użytkownika. Następnie przypisujemy tą linijkę do zmiennej &lt;strong&gt;userString&lt;/strong&gt; i wyświetlamy na standardowym wyjściu. Zmiennym poświęcimy następne wyzwania, na ten moment załóżmy, że jest to jakiś pojemnik na dane tekstowe, które w świecie Javy oznaczamy jako &lt;strong&gt;String&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Gdy uruchomimy nasz program i wpiszemy jakąś linię tekstu (pod napisem Witaj świecie, np. odpowiedź &amp;ldquo;Witaj&amp;rdquo;) potwierdzając to klawiszem Enter, program powinien wyświetlić nam wpisaną linijkę tekstu jak poniżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Witaj świecie!&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Witaj&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Twój napis to: Witaj&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Process finished with exit code &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;wyzwanie&#34;&gt;Wyzwanie&#xA;&lt;/h1&gt;&lt;p&gt;Teraz zadanie dla Was! Korzystając ze standardowych strumieni w Javie i zdobytej wiedzy napiszcie program, który wyświetla prośbę o podanie imienia i następnie nazwiska, pobiera te dwa napisy od użytkownika, a następnie wyświetla obydwa jak w przykładzie poniżej:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Proszę podaj swoje imię:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Jan&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Proszę podaj swoje nazwisko:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Kowalski&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Witaj Jan Kowalski&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Wyzwanie: Naucz się programowania w Javie od postaw!</title>
            <link>https://bigdatapassion.pl/blog/wyzwanie-naucz-si%C4%99-programowania-w-javie-od-postaw/</link>
            <pubDate>Tue, 03 Apr 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/wyzwanie-naucz-si%C4%99-programowania-w-javie-od-postaw/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/banner/kodolamacz/java-kodolamacz.jpg&#34; alt=&#34;Featured image of post Wyzwanie: Naucz się programowania w Javie od postaw!&#34; /&gt;&lt;p&gt;Żyjemy w cyfrowym świecie. Gdzie nie spojrzeć otaczają nas maszyny i urządzenia elektroniczne ułatwiające nam życie. Praktycznie każdy z nas korzysta z komputerów, smartfonów, tabletu czy czytnika ebook&amp;rsquo;ów. W garażu mamy samochody z komputerami pokładowymi, w kuchni programowalne lodówki i piekarniki, w salonie telewizor z systemem operacyjnym zaś po pokoju jeździ automatyczny odkurzacz. Z roku na rok nasze urządzenia się coraz bardziej skomplikowane i coraz więcej potrafią. Jednak do pracy, urządzenia elektroniczne potrzebują odpowiedniego oprogramowania czyli zestawu reguł, poleceniem które mówią mu co mają robić. Czasami są to bardzo proste instrukcje sterujące, innym razem skomplikowane algorytmy starające się naśladować ludzki mózg.&lt;/p&gt;&#xA;&lt;p&gt;Jednak by ten postęp miał miejsce potrzebni są ludzie którzy je tworzą, inżynierowie i programiści których w związku z ciągłym postępem technologicznym ciągle brakuje. Dlatego chcielibyśmy Was zachęcić do nauki programowania. Nie każdy musi zostać od razu programistą, ale w obecnym świecie warto uczyć się programowania choćby po to by zrozumieć technologię która nas otacza. Dlatego coraz częściej mówi się o tym by programowania uczyć już najmłodszych:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/0aoN8Zk0MBs&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Poniżej film (wersja anglojęzyczna) pokazujący dlaczego warto uczyć programowania już w szkole:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/1jAJQKjOA-U&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym filmiku możemy dowiedzieć się na czym polega programowanie:&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/Lhh4iRJWSCI&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Poniżej film nagrany przez Krzysztofa Gonciarza, jednego z najpopularniejszych polskich Youtuberów o tym czy warto programować.&#xA;&lt;div class=&#34;video-wrapper&#34;&gt;&#xA;    &lt;iframe loading=&#34;lazy&#34; &#xA;            src=&#34;https://www.youtube.com/embed/G4Sw-iHEHms&#34; &#xA;            allowfullscreen &#xA;            title=&#34;YouTube Video&#34;&#xA;    &gt;&#xA;    &lt;/iframe&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Jeśli podobały się Wam powyższe filmy i chcielibyście dowiedzieć się na czym polega właśnie to &lt;em&gt;programowanie&lt;/em&gt;, chcielibyśmy rzucić Wam WYZWANIE do nauki programowania. W ciągu najbliższych kilku tygodni będziemy zamieszczać na naszym profilu tak zwane &lt;em&gt;wyzwania programistyczne&lt;/em&gt;, których celem będzie zachęcenie Was do nauki programowania w języku Java. Każde takie wyzwanie będzie zawierać odnośnik do materiałów, gdzie znajdziecie odpowiednią wiedzę oraz zadanie do wykonania. Po każdym wyzwaniu liczymy na informację zwrotną czy się udało lub o problemach które napotkaliście, byśmy mogli Wam pomóc je rozwiązać.&lt;/p&gt;&#xA;&lt;p&gt;Do udziału zachęcamy wszystkich, którzy nigdy nie programowali i chcą zobaczyć na czym to polega, jak i te osoby, które już zaczęły swoją przygodę z programowaniem, ale z innym językiem programowania niż Java lub chcą uzupełnić swoją wiedzę.&lt;/p&gt;&#xA;&lt;p&gt;Lista artykułów:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-1-lets-start-coding&#34; &gt;Wyzwanie Java #1: Hello World!&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-1-lets-start-coding-solution&#34; &gt;rozwiązanie&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-2-basic-steps&#34; &gt;Wyzwanie Java #2: Podstawowe instrukcje&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-2-basic-steps-solution&#34; &gt;rozwiązanie&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-3-object-oriented-programming&#34; &gt;Wyzwanie Java #3: Programowanie obiektowe&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-3-object-oriented-programming-solution&#34; &gt;rozwiązanie&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-4-data-structures-and-algorithms-in-java&#34; &gt;Wyzwanie Java #4: Algorytmy i struktury danych w języku Java&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-4-data-structures-and-algorithms-in-java-solution&#34; &gt;rozwiązanie&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-5-interfaces-and-inheritance&#34; &gt;Wyzwanie Java #5: Interfejsy i dziedziczenie&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-5-interfaces-and-inheritance-solution&#34; &gt;rozwiązanie&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-6-input-output&#34; &gt;Wyzwanie Java #6: Operacje wejścia - wyjścia&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/challenges/java-challenges-6-input-output-solution&#34; &gt;rozwiązanie&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;java-challenges-7-functional-programming&#34; &gt;Wyzwanie Java #6: Operacje wejścia - wyjścia&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;java-challenges-7-functional-programming-solution&#34; &gt;rozwiązanie&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Artykuły dodatkowe:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/introduction-to-java-world&#34; &gt;Wprowadzenie do świata języka Java&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/what-to-learn-to-became-software-developer&#34; &gt;Czego się uczyć by zostać programistą?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/java-how-it-works&#34; &gt;Java od środka, czyli jak to wszystko działa?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/introduction-to-apache-maven&#34; &gt;Wprowadzenie do Apache Maven, czyli jak tworzy się projekty w świecie Java&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/introduction-to-software-testing-in-java&#34; &gt;Wprowadzenie do testowania aplikacji w środowisku Java&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/java/java-best-book-to-read&#34; &gt;Książki które powinien przeczytać każdy programista Java&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Linki do wydarzenia na FB:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wydarzenie&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/?active_tab=discussion&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Dyskusja&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1027925594024404/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wyzwanie nr 1&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1027927304024233/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rozwiązania uczestników&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1032256626924634/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wyzwanie nr 2&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1032257766924520/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rozwiązania uczestników&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1036637573153206/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wyzwanie nr 3&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1036638029819827/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rozwiązania uczestników&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1041336142683349/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wyzwanie nr 4&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1041336822683281/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rozwiązania uczestników&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1046055335544763/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wyzwanie nr 5&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1046056555544641/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rozwiązania uczestników&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1050614288422201/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wyzwanie nr 6&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1050616851755278/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rozwiązania uczestników&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1055363711280592/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Wyzwanie nr 7&lt;/a&gt; (&lt;a class=&#34;link&#34; href=&#34;https://www.facebook.com/events/1023545817795715/permalink/1055364457947184/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;rozwiązania uczestników&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Jak sprawdzić jakiej wersji Linux&#39;a używamy</title>
            <link>https://bigdatapassion.pl/blog/jak-sprawdzi%C4%87-jakiej-wersji-linuxa-u%C5%BCywamy/</link>
            <pubDate>Tue, 20 Mar 2018 21:27:14 +0100</pubDate>
            <guid>https://bigdatapassion.pl/blog/jak-sprawdzi%C4%87-jakiej-wersji-linuxa-u%C5%BCywamy/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/linux/Tux.png&#34; alt=&#34;Featured image of post Jak sprawdzić jakiej wersji Linux&#39;a używamy&#34; /&gt;&lt;p&gt;W tym poście zbiór poleceń pozwalających sprawdzić jakiej wersji systemu używamy. Przydatne gdy chcemy doinstalować dodatkowe oprogramowanie.&lt;/p&gt;&#xA;&lt;h1 id=&#34;debian--ubuntu--mint&#34;&gt;Debian / Ubuntu / Mint&#xA;&lt;/h1&gt;&lt;p&gt;Zaczynamy od najpopularniejszej według &lt;a class=&#34;link&#34; href=&#34;https://distrowatch.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://distrowatch.com/&lt;/a&gt; gałęzi systemów opartych o dystrybucję Debian:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img class=&#34;gallery-image&#34; data-flex-basis=&#34;146px&#34; data-flex-grow=&#34;61&#34; height=&#34;3138&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/d/d8/Debian_family_tree_11-06.png&#34; srcset=&#34;https://bigdatapassion.pl/Debian_family_tree_11-06_15805212876195330265_hu_8d8131e35a3937e.png 800w, https://bigdatapassion.pl/Debian_family_tree_11-06_15805212876195330265_hu_94592025d81cc147.png 1600w, https://upload.wikimedia.org/wikipedia/commons/d/d8/Debian_family_tree_11-06.png 1920w&#34; width=&#34;1920&#34;&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Wydania Debiana: &lt;a class=&#34;link&#34; href=&#34;https://wiki.debian.org/DebianReleases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://wiki.debian.org/DebianReleases&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Wydania Ubuntu: &lt;a class=&#34;link&#34; href=&#34;https://wiki.ubuntu.com/Releases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://wiki.ubuntu.com/Releases&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Wydania Mint&amp;rsquo;a: &lt;a class=&#34;link&#34; href=&#34;https://linuxmint.com/download_all.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://linuxmint.com/download_all.php&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/debian_version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/issue&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/lsb-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/os-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/upstream-release/lsb-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/linuxmint/info&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uname -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsb_release -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsb_release -cs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsb_release -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;red-hat--centos--fedora&#34;&gt;Red Hat / CentOS / Fedora&#xA;&lt;/h1&gt;&lt;p&gt;Teraz kolej na dystrybucje z rodziny Red Hat&amp;rsquo;a&lt;/p&gt;&#xA;&lt;p&gt;&lt;img class=&#34;gallery-image&#34; data-flex-basis=&#34;211px&#34; data-flex-grow=&#34;88&#34; height=&#34;2068&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://upload.wikimedia.org/wikipedia/commons/a/a3/Redhat_family_tree_11-06.png&#34; srcset=&#34;https://bigdatapassion.pl/Redhat_family_tree_11-06_7900157740869724721_hu_87e9e5d7e4d2e7b.png 800w, https://bigdatapassion.pl/Redhat_family_tree_11-06_7900157740869724721_hu_2b1790435e838476.png 1600w, https://upload.wikimedia.org/wikipedia/commons/a/a3/Redhat_family_tree_11-06.png 1820w&#34; width=&#34;1820&#34;&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/centos-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/os-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/redhat-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /etc/system-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rpm --query centos-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;uname -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsb_release -a&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsb_release -cs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsb_release -d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Instalacja HDP 2.6 na pojedynczej maszynie</title>
            <link>https://bigdatapassion.pl/blog/instalacja-hdp-2.6-na-pojedynczej-maszynie/</link>
            <pubDate>Sun, 04 Mar 2018 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/instalacja-hdp-2.6-na-pojedynczej-maszynie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/hortonworks-logo.png&#34; alt=&#34;Featured image of post Instalacja HDP 2.6 na pojedynczej maszynie&#34; /&gt;&lt;p&gt;W tym poście pokażę jak przygotować sobie jedną wirtualną maszynę z zainstalowaną dystrybucją Hortonworks. Taką maszynę, zwaną sandbox&amp;rsquo;em możemy wykorzystywać do celów testowych i developerskich.&lt;/p&gt;&#xA;&lt;h1 id=&#34;stworzenie-maszyny-wirtualbox-i-instalacja-systemu-operacyjnego-centos-6&#34;&gt;Stworzenie maszyny wirtualbox i instalacja systemu operacyjnego CentOS 6&#xA;&lt;/h1&gt;&lt;p&gt;Zaczniemy od stworzenia maszyny wirtualnej i instalacji na niej systemu CentOS 6. Opis jak to zrobić można znaleźć &lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/virtualbox-installing-cluster-with-centos&#34; &gt;tutaj&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;przygotowanie-systemu-operacyjnego-centos-6&#34;&gt;Przygotowanie systemu operacyjnego CentOS 6&#xA;&lt;/h1&gt;&lt;h2 id=&#34;aktualizacja-systemu&#34;&gt;Aktualizacja systemu&#xA;&lt;/h2&gt;&lt;p&gt;Żeby pracować na najnowszej wersji systemu należy go zaktualizować&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;yum -y update&#xA;yum -y upgrade&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;instalacja-vim&#34;&gt;Instalacja Vim&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install vim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;włączamy-automatyczne-dhcp&#34;&gt;Włączamy automatyczne DHCP&#xA;&lt;/h2&gt;&lt;p&gt;Aby włączyć ręcznie dhcp należy wykonać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhclient -v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W celu skonfigurowania tego na stałe warto zmienić wartość (ONBOOT=yes) w pliku /etc/sysconfig/network-scripts/ifcfg-eth0&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/sysconfig/network-scripts/ifcfg-eth0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;włączamy-logowanie-roota-po-haśle&#34;&gt;Włączamy logowanie root&amp;rsquo;a po haśle&#xA;&lt;/h3&gt;&lt;p&gt;Ustawiamy parametr (PermitRootLogin yes) w pliku /etc/ssh/sshd_config&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/ssh/sshd_config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(UWAGA nigdy tego nie róbmy na produkcyjnych serwerach, NIGDY!)&lt;/p&gt;&#xA;&lt;h2 id=&#34;logowanie-po-ssh&#34;&gt;Logowanie po SSH&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli korzystamy z systemów Linux/Mac wygodnym rozwiązaniem może okazać się konfiguracja dostępu z swojego komputer i swojej konsoli. Żeby nie musieć podawać przy logowaniu ciągle hasła, warto wrzucić na maszynę wirtualną swój klucz publiczny by logować się bez hasła.&lt;/p&gt;&#xA;&lt;p&gt;ssh-copy-id root@localhost -p 2222&#xA;ssh root@localhost -p 2222&lt;/p&gt;&#xA;&lt;h2 id=&#34;zmieniamy-hostname&#34;&gt;Zmieniamy hostname&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli podczas instalacji nie ustawiliśmy adresu naszej maszyny możemy zrobić to teraz:&lt;/p&gt;&#xA;&lt;p&gt;Do pliku /etc/sysconfig/network dodajemy wpis:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NETWORKING=yes&#xA;HOSTNAME=sandbox.hortonworks.com&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sprawdzamy za pomocą:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname -f&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Polecenie hostname i hostname -f powinny zwracać tą samą wartość.&lt;/p&gt;&#xA;&lt;p&gt;Warto też ustawić to samo w pliku hosts:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/hosts &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wartość pliku:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;127.0.0.1   sandbox sandbox.hortonworks.com&#xA;127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4&#xA;::1         localhost localhost.localdomain localhost6 localhost6.localdomain6&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Po tej operacji warto zrestartować system.&lt;/p&gt;&#xA;&lt;h2 id=&#34;konfiguracja-epel-release&#34;&gt;Konfiguracja epel release&#xA;&lt;/h2&gt;&lt;p&gt;Dodajemy repozytorium dodatkowych narzędzi systemowych&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install epel-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalacja-przydatnych-narzędzi&#34;&gt;Instalacja przydatnych narzędzi&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install wget vim htop ntp openssh-server openssh-clients nano bash-completion tree&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;konfiguracja-kluczy-publicznego-i-prywatnego&#34;&gt;Konfiguracja kluczy publicznego i prywatnego&#xA;&lt;/h2&gt;&lt;p&gt;Hadoop do działania wymaga by użytkownik systemowy mógł logować się do innych maszyn bez hasła za pomocą infrastruktury klucza prywatnego i publicznego, dlatego wykonujemy poniższe polecenia:&#xA;(przy pierwszym naciskamy klawisz &lt;em&gt;Enter&lt;/em&gt; kilka razy, przy drugim wybieramy &lt;em&gt;yes&lt;/em&gt; i wpisujemy hasło użytkownika &lt;em&gt;root&lt;/em&gt;)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-copy-id sandbox.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh sandbox.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wyłączamy-selinux&#34;&gt;Wyłączamy SELINUX&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39;&lt;/span&gt; /etc/sysconfig/selinux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39;&lt;/span&gt; /etc/selinux/config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setenforce &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sestatus&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wyłączamy-firewalla&#34;&gt;Wyłączamy Firewall&amp;rsquo;a&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chkconfig iptables off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/init.d/iptables stop&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;włączamy-serwer-czasu-ntp&#34;&gt;Włączamy serwer czasu NTP&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y ntp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chkconfig ntpd on&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service ntpd start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;ustawiamy-zalecany-domyślny-umask&#34;&gt;Ustawiamy zalecany domyślny umask&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;umask &lt;span style=&#34;color:#ae81ff&#34;&gt;0022&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo umask &lt;span style=&#34;color:#ae81ff&#34;&gt;0022&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Na koniec restartujemy maszynę.&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-apache-ambari&#34;&gt;Instalacja Apache Ambari&#xA;&lt;/h1&gt;&lt;h2 id=&#34;dodajemy-repozytorium-ambari&#34;&gt;Dodajemy repozytorium Ambari&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -nv http://public-repo-1.hortonworks.com/ambari/centos6/2.x/updates/2.6.1.3/ambari.repo -O /etc/yum.repos.d/ambari.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -nv http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.6.4.0/hdp.repo -O /etc/yum.repos.d/hdp.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum repolist&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum upgrade&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalujemy-ambari&#34;&gt;Instalujemy Ambari&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install ambari-server -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;konfigurujemy-ambari&#34;&gt;Konfigurujemy Ambari&#xA;&lt;/h2&gt;&lt;p&gt;(W każdym pytaniu wybieramy odpowiedź domyślną klikając klawisz &lt;em&gt;Enter&lt;/em&gt; za każdrym razem)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server setup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;restartujemy-ambari&#34;&gt;Restartujemy Ambari&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po tej operacji można zrestartować maszynę. Przed kontynuacją ustawmy naszej maszynie przynajmniej 4 rdzenie oraz przynajmniej 8GB RAM.&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-dystrybucji-hortonworks&#34;&gt;Instalacja dystrybucji Hortonworks&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli wszystko poszło jak trzeba, możemy zalogować się do Ambari we własnej przeglądarce pod adresem: http://localhost:8080/&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-sterownika-jdbc&#34;&gt;Instalacja sterownika JDBC&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install mysql-connector-java*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -al /usr/share/java/mysql-connector-java.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /var/lib/ambari-server/resources/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ln -s /usr/share/java/mysql-connector-java.jar mysql-connector-java.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;instalacja-środowiska-graficznego&#34;&gt;Instalacja środowiska graficznego&#xA;&lt;/h1&gt;&lt;h2 id=&#34;instalacja-pakietów-i-narzędzi&#34;&gt;Instalacja pakietów i narzędzi&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y groupinstall &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X Window System&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y groupinstall &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Desktop&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y groupinstall &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;General Purpose Desktop&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y groupinstall &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Desktop Platform&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y groupinstall &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Graphical Administration Tools&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y groupinstall &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Fonts&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y groupinstall &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Internet Browser&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalacja-przydatnych-narzędzi-1&#34;&gt;Instalacja przydatnych narzędzi&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install gnome-system-monitor firefox htop git vim mc gedit wget&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalacja-dodatków-dla-virtualbox-guest&#34;&gt;Instalacja dodatków dla Virtualbox Guest&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install kernel*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install gcc kernel-devel kernel-headers dkms make bzip2 perl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dodawanie-użytkownika&#34;&gt;Dodawanie użytkownika&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adduser sages&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;passwd sages&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restartujemy maszynę&lt;/p&gt;&#xA;&lt;h2 id=&#34;uruchomienie-trybu-graficznego&#34;&gt;Uruchomienie trybu graficznego&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;startx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/ambari_repositories.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/ambari_repositories.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Ambari i biblioteka libtirpc-devel</title>
            <link>https://bigdatapassion.pl/blog/ambari-i-biblioteka-libtirpc-devel/</link>
            <pubDate>Fri, 17 Nov 2017 19:09:57 +0100</pubDate>
            <guid>https://bigdatapassion.pl/blog/ambari-i-biblioteka-libtirpc-devel/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/hortonworks-logo.png&#34; alt=&#34;Featured image of post Ambari i biblioteka libtirpc-devel&#34; /&gt;&lt;p&gt;Podczas instalacji Ambari na najnowszych platformach CentOS / Red Hat możemy dostać błąd podobny do poniższego:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2017-11-17 13:04:44,147 - Execution of &amp;#39;/usr/bin/yum -d 0 -e 0 -y install hadoop_2_6_3_0_235-client&amp;#39; returned 1. Error: Package: hadoop_2_6_3_0_235-hdfs-2.7.3.2.6.3.0-235.x86_64 (HDP-2.6)&#xA;           Requires: libtirpc-devel&#xA; You could try using --skip-broken to work around the problem&#xA; You could try running: rpm -Va --nofiles --nodigest&#xA;2017-11-17 13:04:44,147 - Failed to install package hadoop_2_6_3_0_235-client. Executing &amp;#39;/usr/bin/yum clean metadata&amp;#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;W celu dokończenia instalacji wystarczy zainstalować brakującą zależność:&lt;/p&gt;&#xA;&lt;p&gt;Dla Red Hat 7.x&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo yum install https://www.rpmfind.net/linux/centos/7.6.1810/os/x86_64/Packages/libtirpc-devel-0.2.4-0.15.el7.x86_64.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Aktualną wersję ścieżki należy sprawdzić na &lt;a class=&#34;link&#34; href=&#34;https://rpmfind.net/linux/rpm2html/search.php?query=libtirpc-devel%28x86-64%29&amp;amp;submit=Search&amp;#43;...&amp;amp;system=CentOS&amp;amp;arch=&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://rpmfind.net/linux/rpm2html/search.php?query=libtirpc-devel%28x86-64%29&amp;submit=Search+...&amp;system=CentOS&amp;arch=&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;Ścieżka do powyższego pliku może się zmieniać (zwiększa się numer wersji), gdy dostaniemy błąd &amp;ldquo;nie ma pliku&amp;rdquo; bądź &amp;ldquo;nie ma nic do zrobienia&amp;rdquo; należy sprawdzić czy ścieżka jest poprawna.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Zaawansowane aspekty wykorzystania RDD w Apache Spark</title>
            <link>https://bigdatapassion.pl/blog/zaawansowane-aspekty-wykorzystania-rdd-w-apache-spark/</link>
            <pubDate>Mon, 07 Aug 2017 16:10:38 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/zaawansowane-aspekty-wykorzystania-rdd-w-apache-spark/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/featured/Apache_Spark_logo.svg.png&#34; alt=&#34;Featured image of post Zaawansowane aspekty wykorzystania RDD w Apache Spark&#34; /&gt;&lt;p&gt;W tym poście powiemy sobie o pewnych aspektach działania Sparka w kontekście przetwarzania RDD.&lt;/p&gt;&#xA;&lt;h1 id=&#34;opóżnione-wykonywanie-i-przechowywanie-rdd&#34;&gt;Opóżnione wykonywanie i przechowywanie RDD&#xA;&lt;/h1&gt;&lt;p&gt;Spark podobnie jak wiele innych narzędzia Big Data takich jak Apache Pig, nie wykonuje naszego programu krok po kroku, tylko odkłada sobie polecenia w pamięci i wykonuje dopiero wtedy gdy są potrzebne. Zaletą takiego podejścia jest wykonywanie tylko tych operacji które były niezbędne oraz możliwość ich optymalizacja przez połączenie ich w prostszą operację (np. kilka operacji filtrowania).&lt;/p&gt;&#xA;&lt;p&gt;Niestety gdy na tym samym zbiorze chcemy wykonać kilka akcji Spark za każdym razem wykona całą listę poleceń potrzebnych do jego uzyskania. Możemy tego uniknąć przez nakazanie Sparkowi zapisania danych zgromadzonych w pośrednich i tymczasowych RDD tak by można było je reużywać. Jest to niezwykle potrzebne w przypadku algorytmów iteracyjnych.&lt;/p&gt;&#xA;&lt;p&gt;Zapisu możemy dokonać za pomocą funkcji &lt;em&gt;persist(storageLevel)&lt;/em&gt; która przyjmuje sposób w jaki dane mają być zapisane w postaci jednej z poniższych wartości:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Poziom&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Opis&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;MEMORY_ONLY&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Domyślny poziom, zapisuje RDD tylko w pamięci RAM jako obiekty maszyny wirtualnej Java (JVM). Jeśli RDD nie zmieści się do pamięci, pewne jego fragmenty (partycje) będą wyliczone w locie kiedy będą potrzebne.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;MEMORY_AND_DISK&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Przechowuje RDD w pamięci RAM jako obiekty JVM, jednakże jeśli zabraknie pamięci pozostałe fragmenty (partycje) są zapisywane na dysku i stamtąd wczytywane w razie potrzeby&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;MEMORY_ONLY_SER&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Zapisuje dane RDD w pamięci RAM ale w postaci zserializowanych obiektów przez co zajmuje mniej miejsca ale zużywa więcej mocy procesora na proces serializacji i deserializacji (dostępny tylko dla języka Java i Scala)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;MEMORY_AND_DISK_SER&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dane trzymane są analogicznie jak w MEMORY_ONLY_SER z tym wyjątkiem, że gdy zabraknie pamięci RAM pozostałe partycje RDD są zapisywane na dysku jako zserializowane obiekty (dostępny tylko dla języka Java i Scala)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;DISK_ONLY&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Zapisuje całe RDD tylko na dysku, dużo wolniejszy zapis i odczyt ale nie zajmuje pamięci RAM&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;MEMORY_ONLY_2, MEMORY_AND_DISK_2, etc.&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Analogicznie do innch poziomów, jednak każda partycja zapisywana jest na dwóch węzłach klastra (replikacja)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;OFF_HEAP (eksperymentalna)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Podobnie do MEMORY_ONLY_SER z tym, że używa pamięci off-heap maszyny wirtualnej (jest to część pamięci maszyny wirtualnej która nie jest zarządzana przez Garbage Collector co zwiększa jej wydajność)&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;UWAGA W przypadku języka Python dostępne są jedynie poziomy: MEMORY_ONLY, MEMORY_ONLY_2, MEMORY_AND_DISK, MEMORY_AND_DISK_2, DISK_ONLY, and DISK_ONLY_2 zaś wszystkie obiekty są zawsze serializowane za pomocą biblioteki &lt;em&gt;Pickle&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Gdy wywołamy funkcję &lt;em&gt;persist&lt;/em&gt; bez parametrów zostanie użyty domyślny poziom zapisu, czyli MEMORY_ONLY. Na RDD mamy jeszcze funkcję &lt;em&gt;cache&lt;/em&gt; która tak naprawdę po wywołaniu wykorzystuje funkcję &lt;em&gt;persist&lt;/em&gt; bez parametrów, co oznacza że powinniśmy ją traktować jedynie jako alias dla metody &lt;em&gt;persist&lt;/em&gt; bez parametrów.&lt;/p&gt;&#xA;&lt;p&gt;Gdy zaczyna brakować pamięci RAM, Spark czyści swój cache zgodnie z algorytmem LRU (least-recently-used), czyli usuwane są dane najdłużej ostatnio nieużywane. Istnieje także możliwość ręcznego zwolnienia pamięci za pomocą metody &lt;em&gt;unpersist&lt;/em&gt;.&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>Przetwarzanie RDD par w Apache Spark</title>
            <link>https://bigdatapassion.pl/blog/przetwarzanie-rdd-par-w-apache-spark/</link>
            <pubDate>Mon, 07 Aug 2017 16:08:07 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/przetwarzanie-rdd-par-w-apache-spark/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/featured/Apache_Spark_logo.svg.png&#34; alt=&#34;Featured image of post Przetwarzanie RDD par w Apache Spark&#34; /&gt;&lt;p&gt;W RDD nie musimy przechowywać pojedynczych obiektów, ale możemy tam przekazywać pary obiektów, czyli tak zwane krotki lub z angielskiego tuple. Na takim RDD mamy dostęp do nowych metod usprawniających nam pracę z krotkami.&lt;/p&gt;&#xA;&lt;h1 id=&#34;tworzenie-rdd-par-w-programie-sterownika&#34;&gt;TWorzenie RDD par w programie sterownika&#xA;&lt;/h1&gt;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Map((1,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala ma kota&amp;#34;&lt;/span&gt;), (2,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świecie&amp;#34;&lt;/span&gt;), (3,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dwadzieścia tysięcy mil podmorskiej żeglugi&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val rddPair &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;toSeq&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rddPair.&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala ma kota&amp;#34;&lt;/span&gt;), (&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świecie&amp;#34;&lt;/span&gt;), (&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dwadzieścia tysięcy mil podmorskiej żeglugi&amp;#34;&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rddPair &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize(lines)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rddPair&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;transformacje-na-rdd-par&#34;&gt;Transformacje na RDD par&#xA;&lt;/h1&gt;&lt;h2 id=&#34;mapowanie-wartości&#34;&gt;Mapowanie wartości&#xA;&lt;/h2&gt;&lt;p&gt;Podobnie jak dla RDD z pojedynczym oboektem, RDD par udostępnia metodę map pozwalającą zmapować jedno RDD w drugie. Możemy także tej metody z powodzeniem użyć do stworzenia RDD par z zwykłego RDD jak w poniższym przykładzie gdzie mapujemy linie tekstu na krotki zawierające linię i jej długość:&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val pairs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; (line, line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pairs.&lt;span style=&#34;color:#a6e22e&#34;&gt;take&lt;/span&gt;(10).&lt;span style=&#34;color:#a6e22e&#34;&gt;foreach&lt;/span&gt;(println)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;textFile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pairs &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;map(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; line : (line, len(line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pairs&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;take(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W przypadku RDD par możemy także skorzystać z metody &lt;em&gt;map&lt;/em&gt; mapując całą krotkę na inny obiekt lub inną krotkę, ale możemy także skorzystać z funkcji &lt;em&gt;mapValues&lt;/em&gt; oraz &lt;em&gt;flatMapValues&lt;/em&gt; które to mapują nam same wartości z naszej krotki bez zmiany klucza, oraz w drugim przypadku dokonują także &amp;ldquo;spłaszczenia&amp;rdquo; listy tablic na jedną listę wszystkich obiektów, w tym przypadku RDD.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val values &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; List((&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,3), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, 4), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, 5), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,5), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, 3), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, 4))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val valueRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(values)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val countRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; valueRdd.&lt;span style=&#34;color:#a6e22e&#34;&gt;mapValues&lt;/span&gt;( v &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; (v, 1))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;countRdd.&lt;span style=&#34;color:#a6e22e&#34;&gt;take&lt;/span&gt;(10).&lt;span style=&#34;color:#a6e22e&#34;&gt;foreach&lt;/span&gt;(println)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;values &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;valueRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize(values)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;countRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; valueRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mapValues(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; v : (v, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;countRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;redukcja-wartości&#34;&gt;Redukcja wartości&#xA;&lt;/h2&gt;&lt;p&gt;Oprócz mapowania drugą bardzo popularną operacją jest agregacja której możemy dokonać za pomocą funkcji &lt;em&gt;reduceByKey&lt;/em&gt;, &lt;em&gt;combineByKey&lt;/em&gt; oraz &lt;em&gt;groupByKey&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Funkcja &lt;em&gt;groupByKey&lt;/em&gt; umożliwia nam zgrupowaniu wszystkich wartości występujących pod wspólnym kluczem i zwraca nowe RDD.&lt;/p&gt;&#xA;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;values &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;valueRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize(values)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;group &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; valueRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;groupByKey()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;group&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mapValues(list)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Funkcja &lt;em&gt;reduceByKey&lt;/em&gt; pozwala dodatkowo wskazać funkcję która zredukuje zgrupowane wartości do pojedynczego elementu:&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val values &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; List((&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,3), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, 4), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, 5), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,5), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, 3), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, 4))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val valueRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(values)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val avgRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; valueRdd.&lt;span style=&#34;color:#a6e22e&#34;&gt;mapValues&lt;/span&gt;( v &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; (v, 1)).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    reduceByKey( (x,y) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; (x.&lt;span style=&#34;color:#a6e22e&#34;&gt;_1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y.&lt;span style=&#34;color:#a6e22e&#34;&gt;_1&lt;/span&gt;, x.&lt;span style=&#34;color:#a6e22e&#34;&gt;_2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y.&lt;span style=&#34;color:#a6e22e&#34;&gt;_2&lt;/span&gt;) ).&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mapValues( x &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; (x.&lt;span style=&#34;color:#a6e22e&#34;&gt;_1&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;toDouble&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; x.&lt;span style=&#34;color:#a6e22e&#34;&gt;_2&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;toDouble&lt;/span&gt;) )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;avgRdd.&lt;span style=&#34;color:#a6e22e&#34;&gt;take&lt;/span&gt;(10).&lt;span style=&#34;color:#a6e22e&#34;&gt;foreach&lt;/span&gt;(println)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;values &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;valueRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize(values)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;avgRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; valueRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mapValues(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; v : (v, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;reduceByKey(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; x,y: (x[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;], x[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]) )&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;mapValues(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; x: ( float(x[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]) &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; float(x[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]) ) )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;avgRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;mapreduce-w-rdd&#34;&gt;MapReduce w RDD&#xA;&lt;/h2&gt;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val wordsRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;flatMap&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val wordCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wordsRdd.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; (x,1)).&lt;span style=&#34;color:#a6e22e&#34;&gt;reduceByKey&lt;/span&gt;( (x,y) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordCount.&lt;span style=&#34;color:#a6e22e&#34;&gt;sortByKey&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;take&lt;/span&gt;(10).&lt;span style=&#34;color:#a6e22e&#34;&gt;foreach&lt;/span&gt;(println)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;textFile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordsRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;flatMap(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; line : line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wordsRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;map(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; w: (w,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) )&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;reduceByKey(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; x, y: x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordCount&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sortByKey()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;take(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub w znacznie prostszej wersji :)&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val wordsRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;flatMap&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val wordCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wordsRdd.&lt;span style=&#34;color:#a6e22e&#34;&gt;countByValue&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;textFile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordsRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;flatMap(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; line : line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; wordsRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;countByValue()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(wordCount)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;sortowanie-po-kluczu&#34;&gt;Sortowanie po kluczu&#xA;&lt;/h2&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;values &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;valueRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize(values)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sort &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; valueRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sortByKey()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sort&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;zliczanie-po-kluczu&#34;&gt;Zliczanie po kluczu&#xA;&lt;/h2&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;values &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Tomek&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;), (&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kasia&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;)]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;valueRdd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize(values)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; valueRdd&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;countByKey()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(count)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Resilient Distributed Dataset w Apache Spark</title>
            <link>https://bigdatapassion.pl/blog/resilient-distributed-dataset-w-apache-spark/</link>
            <pubDate>Thu, 03 Aug 2017 02:00:34 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/resilient-distributed-dataset-w-apache-spark/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/featured/Apache_Spark_logo.svg.png&#34; alt=&#34;Featured image of post Resilient Distributed Dataset w Apache Spark&#34; /&gt;&lt;h1 id=&#34;wprowadzenie&#34;&gt;Wprowadzenie&#xA;&lt;/h1&gt;&lt;p&gt;RDD (Resilient Distributed Datasets) są podstawowym typem danych wykorzystywanym przez Spark aktualnie będącymi częścią tak zwanego Spark Core czyli bazowego modułu Apache Spark.&lt;/p&gt;&#xA;&lt;p&gt;Na RDD będziemy wykonywać różne metody które dzielimy na &lt;em&gt;transformacje&lt;/em&gt; i &lt;em&gt;akcje&lt;/em&gt;. Transformacje przekształcają nam RDD w inne RDD, zaś akcje generują z RDD wynik który może być zwrócony do sterownika bądź zapisany w HDFS&amp;rsquo;ie lub innym obsługiwanym źródle danych.&lt;/p&gt;&#xA;&lt;h1 id=&#34;tworzenie-rdd&#34;&gt;Tworzenie RDD&#xA;&lt;/h1&gt;&lt;p&gt;W realnych zastosowaniach RDD tworzy się poprzez wczytanie danych z rozproszonych zasobów sieciowych takich jak na przykład HDFS, Cassandra, MongoDB, Amazon S3 i wielu innych. Mając doczynienia z dużo mniejszymi zbiorami, możemy je zaczytać w programie sterownika i przekształcić programowo w rozproszony zbiór RDD. Pomoże nam w tym funkcja &lt;em&gt;parallelize&lt;/em&gt; na obiekcie SparkContext (domyślnie dostępny w Shell dla języka Scala i Python). Poniżej przykłady utworzenia takiego zbioru RDD z utworzonej kolekcji w programie sterownika.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pizza&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hamburger&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;lasagne&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pizza&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hamburger&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;lasagne&amp;#34;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Do wczytania pliku tekstowego możemy skorzystać z funkcji &lt;em&gt;textFile&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;textFile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;transformacje&#34;&gt;Transformacje&#xA;&lt;/h1&gt;&lt;h2 id=&#34;mapowanie-wartości&#34;&gt;Mapowanie wartości&#xA;&lt;/h2&gt;&lt;p&gt;Jedną z najpopularnieszych tranformacji jest &lt;em&gt;map&lt;/em&gt; pozwalająca na zmianę obiektów jednego RDD na zupełnie inne obiekty w wynikowym RDD. Typ obiektu wejściowego i wynikowego mogą się różnić, np. liczby możemy zmienić na stałe napisowe.&lt;/p&gt;&#xA;&lt;p&gt;Poniżej przykład mapowania RDD zawierającego liczby na nowe RDD z ich kwadratami.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(1,2,3,4,5))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val squared &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(x &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; x)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; squared.&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(result.&lt;span style=&#34;color:#a6e22e&#34;&gt;mkString&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;squared &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;map(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; x: x &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; x)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;results &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; squared&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; result &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; results:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print result&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UWAGA&#xA;Do wyświetlenia wynikowego RDD użyliśmy funkcji &lt;em&gt;collect&lt;/em&gt; która zwróciła tablicę wszystkich elementów w RDD. Przy bardzo dużych RDD ściągnięcie wszystkich wartości do programu sterownika może wygenerować błąd braku wystarczającej ilości pamięci RAM.&lt;/p&gt;&#xA;&lt;p&gt;Jeśli chcemy by nowe RDD miało więcej obiektów, możemy zwrócić RDD zawierające kolekcje (jeden obiekt wejściowy mapujemy w oddzielną kolekcję) lub użyć metody &lt;em&gt;flatMap&lt;/em&gt; zwracającą nowe RDD mające wszystkie nasze nowe obiekty.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala ma kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świecie&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dwadzieścia tysięcy mil podmorskiej żeglugi&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;flatMap&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; words.&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(result.&lt;span style=&#34;color:#a6e22e&#34;&gt;mkString&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ala ma kota&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Witaj świecie&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Dwadzieścia tysięcy mil podmorskiej żeglugi&amp;#34;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;words &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;flatMap(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; line: line&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;results &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; words&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; result &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; results:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print result&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;filtrowanie-wartośći&#34;&gt;Filtrowanie wartośći&#xA;&lt;/h2&gt;&lt;p&gt;Drugą bardzo popularną transformacją jest funkcja &lt;em&gt;filter&lt;/em&gt; zwracająca nowe RDD z elementami które spełniły wskazany warunek.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val sparkLines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines.&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Spark&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sparkLines.&lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sparkLines.&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;textFile(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sparkLines &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lines&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;filter(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; line: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Spark&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; line)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sparkLines&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sparkLines&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;pomijanie-duplikatów&#34;&gt;Pomijanie duplikatów&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli chcemy pominąć duplikaty w naszym rozproszonym RDD możemy skorzystać z funkcji &lt;em&gt;distinct&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(1,2,2,3,4,4,5))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val distinct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums.&lt;span style=&#34;color:#a6e22e&#34;&gt;distinct&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(distinct.&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;mkString&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;distinct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;distinct()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(distinct&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;próbkowanie&#34;&gt;Próbkowanie&#xA;&lt;/h2&gt;&lt;p&gt;Czasami chcemy przetestować nasz algorytm na mniejszej, czy nawet znacznie mniejszej próbce danych. Idealnie nadaje się do tego funkcja &lt;em&gt;sample&lt;/em&gt; która pozwala zwrócić nam tylko część naszego RDD.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(1,2,3,4,5))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val sample &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums.&lt;span style=&#34;color:#a6e22e&#34;&gt;sample&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;, 0.&lt;span style=&#34;color:#a6e22e&#34;&gt;5&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(sample.&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;mkString&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sample &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sample(&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0.5&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(sample&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Trzeba pamiętać, że algorytm jest niederteministyczny, co oznacza, że każde wywołanie programu zwraca nam zupełnie inny wynik.&lt;/p&gt;&#xA;&lt;h2 id=&#34;operacje-na-wielu-zbiorach&#34;&gt;Operacje na wielu zbiorach&#xA;&lt;/h2&gt;&lt;p&gt;Transformacje nie muszą pracować na jednym RDD ale mogą także operować na wielu zbiorach. Podstawowymi transformacjami działającymi na wielu RDD są:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;union - łączenie dwóch RDD&lt;/li&gt;&#xA;&lt;li&gt;intersection - zwraca część wspólną obydwu RDD (bez duplikatów)&lt;/li&gt;&#xA;&lt;li&gt;subtract - różnica dwóch zbiorów&lt;/li&gt;&#xA;&lt;li&gt;cartesian - iloczyn kartezjański, zwraca połączenie każdego elementu pierwszego zbioru z każdym elementem drugiego zbioru&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val rdd1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(1,2,3,4,5))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val rdd2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(4,5,6,7))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val union &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rdd1.&lt;span style=&#34;color:#a6e22e&#34;&gt;union&lt;/span&gt;(rdd2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(union.&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;mkString&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val intersection &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rdd1.&lt;span style=&#34;color:#a6e22e&#34;&gt;intersection&lt;/span&gt;(rdd2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(intersection.&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;mkString&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val subtract &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rdd1.&lt;span style=&#34;color:#a6e22e&#34;&gt;subtract&lt;/span&gt;(rdd2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(subtract.&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;mkString&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val cartesian &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rdd1.&lt;span style=&#34;color:#a6e22e&#34;&gt;cartesian&lt;/span&gt;(rdd2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(cartesian.&lt;span style=&#34;color:#a6e22e&#34;&gt;collect&lt;/span&gt;().&lt;span style=&#34;color:#a6e22e&#34;&gt;mkString&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;, &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rdd1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rdd2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;union &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rdd1&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;union(rdd2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(union&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;intersection &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rdd1&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;intersection(rdd2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(intersection&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;subtract &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rdd1&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;subtract(rdd2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(subtract&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cartesian &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; rdd1&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cartesian(rdd2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(cartesian&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Trzeba jednak pamiętać, że w projektach Big Data takie operacje na dużych zbiorach bywają niezwykle kosztowne obliczeniowo a czasami nawet nie możliwe do przeprowadzenia, np. iloczyn kartezjański dwóch bardzo licznych zbiorów może wygenerować tak duży zbiór wynikowy, którego nie będziemy w stanie zapisać ani w pamięci RAM ani także na naszym dysku. Dodatkowo operacje na zbiorach rozproszonych często mogą spowodować bardzo dużo połączeń i przesunięc danych z jednego serwera na drugi, co także znacząco spowolni nasze obliczenia (nie bazujemy tutaj na tak zwanej lokalności danych).&lt;/p&gt;&#xA;&lt;h1 id=&#34;akcje&#34;&gt;Akcje&#xA;&lt;/h1&gt;&lt;h2 id=&#34;redukcja-rdd&#34;&gt;Redukcja RDD&#xA;&lt;/h2&gt;&lt;p&gt;Jedną z najpopularniejszych akcji używanych w Apache Spark jest &lt;em&gt;reduce&lt;/em&gt; pozwalająca na zredukowanie całego RDD do pojedynczego obiektu tego samego typu co elementy RDD.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(1,2,3,4,5))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums.&lt;span style=&#34;color:#a6e22e&#34;&gt;reduce&lt;/span&gt;( (x, y) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(sum)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;reduce(&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; x, y: x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(sum)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podobnie działa funkcja &lt;em&gt;fold&lt;/em&gt; umożliwiająca redukcję z wartością startową (wartość ta nie powinna wpływać na wynik, np. pusta lista lub wartość zero dla sumy).&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(1,2,3,4,5))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums.&lt;span style=&#34;color:#a6e22e&#34;&gt;fold&lt;/span&gt;(0)((x, y) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(sum)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;fold(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; x, y: x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; y)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(sum)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli dodatkowo chcemy zmienić typ zwracanej wartości, musimy skorzystać z jeszcze innej funkcji o nazwie &lt;em&gt;aggregate&lt;/em&gt; która także przyjmuje wartość startową. Do &lt;em&gt;aggregate&lt;/em&gt; musimy przekazać dwie funkcje, pierwsza służy do redukcji w ramach partycji (danych zgromadzonych fizycznie razem na jednej maszynie) a następnie drugiej funkcji która łączy ze sobą wyniki z poprzedniego kroku.&lt;/p&gt;&#xA;&lt;p&gt;W poniższym przykładzie zwrócimy krotkę (tuple) zawierającą zarówno sumę jak i liczbę obiektów, co wykorzystamy do wyliczenia średniej.&lt;/p&gt;&#xA;&lt;p&gt;Scala:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc.&lt;span style=&#34;color:#a6e22e&#34;&gt;parallelize&lt;/span&gt;(List(1,2,3,4,5,6))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val sumCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums.&lt;span style=&#34;color:#a6e22e&#34;&gt;aggregate&lt;/span&gt;((0, 0))(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (acc, value) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; (acc.&lt;span style=&#34;color:#a6e22e&#34;&gt;_1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; value, acc.&lt;span style=&#34;color:#a6e22e&#34;&gt;_2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; 1),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (acc1, acc2) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; (acc1.&lt;span style=&#34;color:#a6e22e&#34;&gt;_1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; acc2.&lt;span style=&#34;color:#a6e22e&#34;&gt;_1&lt;/span&gt;, acc1.&lt;span style=&#34;color:#a6e22e&#34;&gt;_2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; acc2.&lt;span style=&#34;color:#a6e22e&#34;&gt;_2&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;println(sumCount)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val avg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sumCount.&lt;span style=&#34;color:#a6e22e&#34;&gt;_1&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;toDouble&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; sumCount.&lt;span style=&#34;color:#a6e22e&#34;&gt;_2&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;toDouble&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;println&lt;/span&gt;(avg)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sumCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;aggregate((&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; acc, value: (acc[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; value, acc[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) ),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#66d9ef&#34;&gt;lambda&lt;/span&gt; acc1, acc2: (acc1[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; acc2[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;], acc1[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; acc2[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]) )&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(sumCount)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;avg &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; float(sumCount[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]) &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; float(sumCount[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(avg)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;pobieranie-danych-do-programu-sterownika&#34;&gt;Pobieranie danych do programu sterownika&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli po przetworzeniu nasze RDD jest na tyle małe, że może nam się zmieścić w pamięci RAM maszyny na której uruchomiliśmy nasz program sterownik, możemy skorzystać z możliwości ściągnięcia ich na tą maszynę i tam zapisanie lub dalsze przetworzenie.&lt;/p&gt;&#xA;&lt;p&gt;Najprostrzym sposobem na to jest używana we wcześniejszych przykładach funkcja &lt;em&gt;collect&lt;/em&gt; zwracająca RDD jako zwykła kolekcja obiektów.&lt;/p&gt;&#xA;&lt;p&gt;W sytuacji gdy nie potrzebujemy pobierać całego RDD na lokalną maszynę możemy użyć funkcji &lt;em&gt;take(n)&lt;/em&gt; zwracająca n dowolnych elementów, &lt;em&gt;top(n)&lt;/em&gt; zwracająca najwyższe elementy, &lt;em&gt;takeOrdered&lt;/em&gt; analogiczna do top ale umożliwiająca przekazanie własnej funkcji porównującej oraz &lt;em&gt;takeSample(withReplacement, n, seed)&lt;/em&gt; zwracająca n elementów w losowy sposób.&lt;/p&gt;&#xA;&lt;p&gt;Jeszcze inną przydatną funkcją jest &lt;em&gt;first&lt;/em&gt; zwracająca pierwszy element RDD.&lt;/p&gt;&#xA;&lt;h2 id=&#34;zliczanie-ilości&#34;&gt;Zliczanie ilości&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli chcemy sprawdzić ile elementów zawiera nasz RDD możemy skorzystać z funkcji &lt;em&gt;count&lt;/em&gt; oraz &lt;em&gt;countByValue&lt;/em&gt; zwracająca ilość unikalnych elementów w postaci mapy element -&amp;gt; liczność.&lt;/p&gt;&#xA;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(count)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;countByValue &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;countByValue()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(countByValue)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wykonywanie-operacji-na-każdym-elemencie&#34;&gt;Wykonywanie operacji na każdym elemencie&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli zajdzie nam potrzeba wykonania jakiejś operacji na każdym elemencie w sposób rozproszony bez konieczności zwracania jej wyniku, możemy skorzystać z funkcji &lt;em&gt;foreach&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parallelize([&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;f&lt;/span&gt;(x): print(x)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;foreach(f)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;Strona projektu &lt;a class=&#34;link&#34; href=&#34;http://spark.apache.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://spark.apache.org&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Dokumentacja &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Scala &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/scala/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/scala/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Java &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/java/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/java/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Python &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/python/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/python/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Biblioteka Pickle dla Pythona &lt;a class=&#34;link&#34; href=&#34;https://docs.python.org/2/library/pickle.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.python.org/2/library/pickle.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Podstawy programowania Apache Spark</title>
            <link>https://bigdatapassion.pl/blog/podstawy-programowania-apache-spark/</link>
            <pubDate>Sun, 30 Jul 2017 14:49:14 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/podstawy-programowania-apache-spark/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/featured/Apache_Spark_logo.svg.png&#34; alt=&#34;Featured image of post Podstawy programowania Apache Spark&#34; /&gt;&lt;h1 id=&#34;programowanie-apache-spark&#34;&gt;Programowanie Apache Spark&#xA;&lt;/h1&gt;&lt;p&gt;Apache Spark został napisany w języku Scala, przez co domyślnym językiem programowania jak i tym które oferuje najwięcej możliwości jest właśnie Scala. Dzięki wyjątkowo dobrej kompatybilności Scali z językiem Java, drugim językiem programowania jaki jest dostępny dla tej platformy jest oczywiście język Java oferujący od wersji 8 wiele funkcjonalności zbliżonych do języka Scala (dosłownie rzecz biorąc, twórcy języka Java w wersji 8 wzorowali się między innymi na języku Scala wprowadzając nowe funkcjonalności). Z racji dużej popularności języka Python wśród analityków i inżynierów Big Data, twórcy także dodali wsparcie dla tego języka. Osoby nie mający doświadczenia z programowaniem w powyższych językach ale znający pakiet R mogą także skorzystać z API stworzonego dla tego języka (o tym w innych postach). Ostatnim językiem który mogą wykorzystać użytkownicy Apache Spark jest obecnie najpopularniejszy język świata jakim jest język SQL. Można tutaj skorzystać zarówno z modułu zwanego Spark SQL ale także użytkownicy Apache Hive mogą skonfigurować go do wykorzystania Apache Spark jako silnika przetwarzającego dane (obok Apache Hadoop MapReduce czy Apache Tez).&lt;/p&gt;&#xA;&lt;p&gt;W tym poście skupimy się na podstawach programowania w języku Scala, Java i Python.&lt;/p&gt;&#xA;&lt;h1 id=&#34;podstawowe-operacje-apache-spark-czyli-zliczanie-słów&#34;&gt;Podstawowe operacje Apache Spark czyli zliczanie słów&#xA;&lt;/h1&gt;&lt;p&gt;Jednymi z podstawowych funkcji Apache Spark są funkcje &lt;em&gt;map&lt;/em&gt; i &lt;em&gt;reduce&lt;/em&gt;, dobrze znane programistom języków funkcyjnych czy użytkownikom Apache Hadoop oraz innych narzędzi jak MongoDB, Cassandra implementujących paradygmat MapReduce.&lt;/p&gt;&#xA;&lt;p&gt;Funkcja &lt;em&gt;map&lt;/em&gt; służy do transformacji jednego bytu w coś innego, np możemy zmienić linijki w liczbę oznaczającą liczbę słów w tej linii:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lineSizeDataset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lineSizeDataset.&lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;(10)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;w wyniku czego otrzymamy w konsoli następujący rezultat:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.read.textFile&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: string&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val lineSizeDataset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.map&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; line.split&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.size&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lineSizeDataset: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Int&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: int&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; lineSizeDataset.show&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|value|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    3|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    1|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   14|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   13|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   11|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   12|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    8|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    6|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    1|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    1|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;only showing top &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; rows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak widać funkcja &lt;em&gt;map&lt;/em&gt; utworzyła nam nowy Dataset zawierający tyle samo elementów, jednak jako wartości są ilości słów w linii. Dodatkowo na koniec dodałem funkcję  &lt;em&gt;show&lt;/em&gt; która wyświetla przekazaną ilość parametrów w konsoli z kolekcji typu Dataset.&lt;/p&gt;&#xA;&lt;p&gt;Funkcja &lt;em&gt;reduce&lt;/em&gt; służy do &amp;ldquo;redukcji&amp;rdquo; naszego zbioru, czyli jego &amp;ldquo;uproszczeniu&amp;rdquo;. W tym przypadku chcemy zsumować liczbę słów w każdej linijce tekstu by otrzymać łączną liczbę słów w całym tekście.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val lineSizeDataset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;size&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val textFileWordCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lineSizeDataset.&lt;span style=&#34;color:#a6e22e&#34;&gt;reduce&lt;/span&gt;((a, b) &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; b)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po uruchomieniu programu otrzymaliśmy wynik w postaci:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.read.textFile&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: string&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val lineSizeDataset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.map&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; line.split&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.size&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lineSizeDataset: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Int&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: int&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val textFileWordCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lineSizeDataset.reduce&lt;span style=&#34;color:#f92672&#34;&gt;((&lt;/span&gt;a, b&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; a + b&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFileWordCount: Int &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;566&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;czyli cały tekst ma 566 słów.&lt;/p&gt;&#xA;&lt;p&gt;Ten sam przykład w języku Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; pyspark.sql.functions &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lineSizeDataset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;select(size(split(textFile&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;value, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\s&amp;#34;&lt;/span&gt;))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;numWords&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lineSizeDataset&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;show(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFileWordCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lineSizeDataset&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;agg(sum(col(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;numWords&amp;#34;&lt;/span&gt;))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collect()[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;][&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFileWordCount&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wynik:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.read.text&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; from pyspark.sql.functions import *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; lineSizeDataset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.select&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;size&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;split&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;textFile.value, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\s&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;.name&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;numWords&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; lineSizeDataset.show&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|numWords|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|       3|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|       1|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|      14|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|      13|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|      11|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|      12|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|       8|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|       6|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|       1|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|       1|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;only showing top &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; rows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; textFileWordCount &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; lineSizeDataset.agg&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;sum&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;col&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;numWords&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;.name&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;.collect&lt;span style=&#34;color:#f92672&#34;&gt;()[&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;][&lt;/span&gt;0&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; textFileWordCount&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;API dla DataFrame jest trochę inne niż w języku Scala, tutaj nie użyliśmy funkcji &lt;em&gt;map&lt;/em&gt; tylko &lt;em&gt;select&lt;/em&gt;, zaś zamiast &lt;em&gt;reduce&lt;/em&gt; użyliśmy funkcji &lt;em&gt;agg&lt;/em&gt;. Dodatkowo skorzystaliśmy z wbudowanych w język Python funkcji.&lt;/p&gt;&#xA;&lt;h1 id=&#34;apache-spark-i-mapreduce&#34;&gt;Apache Spark i MapReduce&#xA;&lt;/h1&gt;&lt;p&gt;Osoby które znają paradygmat MapReduce i korzystali z projektu Apache Hadoop, wiedzą, że swoistym &amp;ldquo;Witaj Świecie&amp;rdquo; dla aplikacji typu MapReduce jest przypadek zliczania ilości wystąpień każdego ze słów a nie wszystkich razem. Taki przypadek także bardzo łatwo uzyskać za pomocą Apache Spark korzystając z funkcji &lt;em&gt;flatMap&lt;/em&gt; oraz &lt;em&gt;groupByKey&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val wordCounts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.&lt;span style=&#34;color:#a6e22e&#34;&gt;flatMap&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)).&lt;span style=&#34;color:#a6e22e&#34;&gt;groupByKey&lt;/span&gt;(identity).&lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordCounts.&lt;span style=&#34;color:#a6e22e&#34;&gt;sort&lt;/span&gt;($&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;count(1)&amp;#34;&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;desc&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;(10)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;w wyniku otrzymujemy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.read.textFile&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: string&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val wordCounts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.flatMap&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; line.split&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;.groupByKey&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;identity&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.count&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordCounts: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[(&lt;/span&gt;String, Long&lt;span style=&#34;color:#f92672&#34;&gt;)]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: string, count&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: bigint&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; wordCounts.sort&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;$&amp;#34;count(1)&amp;#34;&lt;/span&gt;.desc&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.show&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+--------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|value|count&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+--------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     |      71|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  the|      24|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   to|      17|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|Spark|      16|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;|      12|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   &lt;span style=&#34;color:#75715e&#34;&gt;##|       9|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  and|       9|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    a|       8|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   on|       7|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  run|       7|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+--------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;only showing top &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; rows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pierwszą różnicą w stosunku do poprzedniego przypadku jest użycie &lt;em&gt;flatMap&lt;/em&gt; zamiast &lt;em&gt;map&lt;/em&gt;. Robimy to dlatego że w pierwszym przypadku mapowaliśmy linie tekstu na ilość słów w tej linii, czyli dla każdego elementu wejściowego zbioru produkowaliśmy dokładnie jeden element wynikowy. W drugim przypadku dla jednej linijki tekstu produkujemy listę słów, czyli ostatecznie mamy Dataset złożony z tablicy obiektów co można zauważyć na poniższym fragmencie kodu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val wordsDataset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.&lt;span style=&#34;color:#a6e22e&#34;&gt;map&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;split&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordsDataset.&lt;span style=&#34;color:#a6e22e&#34;&gt;show&lt;/span&gt;(10)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;w wyniku otrzymujemy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.read.textFile&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: string&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val wordsDataset &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.map&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;line &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;gt; line.split&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordsDataset: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Array&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;]]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: array&amp;lt;string&amp;gt;&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; wordsDataset.show&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------------------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|               value|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------------------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#, Apache, Spark]|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|                  &lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Spark, is, a, fa...|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;high-level, APIs...|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;supports, genera...|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;rich, set, of, h...|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;MLlib, &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;, mach...|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;and, Spark, Stre...|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|                  &lt;span style=&#34;color:#f92672&#34;&gt;[]&lt;/span&gt;|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;&amp;lt;http://spark.ap...|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+--------------------+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;only showing top &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; rows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Z racji tego że chcemy ostatecznie mieć Dataset zawierający wszystkie słowa a nie tablice słów, musimy go niejako &amp;ldquo;spłaszczyć&amp;rdquo;, czyli z angielskiego &amp;ldquo;to flat&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Podobnie jest w przypadku funkcji &lt;em&gt;reduce&lt;/em&gt; i &lt;em&gt;groupByKey&lt;/em&gt;. Pierwsza funkcja pozwala nam zredukować Dataset do pojedynczej wartości, zaś druga użyta w tym przypadku funkcja robi dokładnie to co silnik MapReduce, czyli grupuje nam wszystkie identyczne elementy z wejściowego Dataset w jeden podzbiór, gdzie dla każdego wykonujemy funkcję &lt;em&gt;count&lt;/em&gt; zwracającą nam jego liczność.&lt;/p&gt;&#xA;&lt;p&gt;W przypadku języka Python powyższy algorytm MapReduce mógłby wyglądać tak:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; pyspark.sql.functions &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordCounts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;select(explode(split(textFile&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;value, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\s&amp;#34;&lt;/span&gt;))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&amp;#34;&lt;/span&gt;))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;groupBy(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wordCounts&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sort(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;,ascending&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;show(&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;wynik:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.read.text&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; from pyspark.sql.functions import *&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; wordCounts &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.select&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;explode&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;split&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;textFile.value, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;\s&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;.name&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt;.groupBy&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;word&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.count&lt;span style=&#34;color:#f92672&#34;&gt;()&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; wordCounts.sort&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;count&amp;#34;&lt;/span&gt;,ascending&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;False&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;.show&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;10&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;| word|count|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|     |   71|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  the|   24|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   to|   17|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|Spark|   16|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;|   12|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   &lt;span style=&#34;color:#75715e&#34;&gt;##|    9|&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  and|    9|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|    a|    8|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   on|    7|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|  run|    7|&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-----+-----+&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;only showing top &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; rows&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jak widać, nasz rezultat jest identyczny jak w przypadku języka Scala. Tutaj także skorzystaliśmy z funkcji &lt;em&gt;select&lt;/em&gt; w kombinacji z &lt;em&gt;explode&lt;/em&gt; zamiast z &lt;em&gt;flatMap&lt;/em&gt; oraz funkcji &lt;em&gt;groupBy&lt;/em&gt; zamiast &lt;em&gt;groupByKey&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;Strona projektu &lt;a class=&#34;link&#34; href=&#34;http://spark.apache.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://spark.apache.org&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Dokumentacja &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Scala &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/scala/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/scala/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Java &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/java/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/java/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Python &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/python/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/python/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Spark SQL &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/sql/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/sql/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Hive na Spark&amp;rsquo;u &lt;a class=&#34;link&#34; href=&#34;https://cwiki.apache.org/confluence/display/Hive/Hive&amp;#43;on&amp;#43;Spark%3A&amp;#43;Getting&amp;#43;Started&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Hive na Spark&amp;rsquo;u (JIRA) &lt;a class=&#34;link&#34; href=&#34;https://issues.apache.org/jira/browse/HIVE-7292&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://issues.apache.org/jira/browse/HIVE-7292&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Szybki start z Apache Spark</title>
            <link>https://bigdatapassion.pl/blog/szybki-start-z-apache-spark/</link>
            <pubDate>Sat, 29 Jul 2017 13:18:41 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/szybki-start-z-apache-spark/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/featured/Apache_Spark_logo.svg.png&#34; alt=&#34;Featured image of post Szybki start z Apache Spark&#34; /&gt;&lt;h1 id=&#34;pobranie-apache-spark&#34;&gt;Pobranie Apache Spark&#xA;&lt;/h1&gt;&lt;p&gt;Sparka najlepiej pobrać ze strony projektu: &lt;a class=&#34;link&#34; href=&#34;http://spark.apache.org/downloads.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://spark.apache.org/downloads.html&lt;/a&gt;. Ja skorzystam z wersji 2.2.0 przystosowanej do pracy z Apache Hadoop w wersji 2.7 lub wyższej.&#xA;Po ściągnięciu należy wypakować w dowolnym katalogu na dysku.&lt;/p&gt;&#xA;&lt;p&gt;Spark działa na systemach z rodziny Windows oraz Unix (Linux, MacOS, etc.). Ja skorzystam z systemu Linux Mint.&lt;/p&gt;&#xA;&lt;p&gt;Do działa Sparka będzie wymagana Java 8+, Python 2.7+/3.4+ i R 3.1+ oraz Scala 2.11 (ze względu na kompatybilność musimy użyć dokładnie tej wersji 2.11.x).&lt;/p&gt;&#xA;&lt;h1 id=&#34;uruchomienie&#34;&gt;Uruchomienie&#xA;&lt;/h1&gt;&lt;p&gt;Po rozpakowaniu ściągniętej paczki, wchodzi do utworzonego katalogu i w konsoli wykonujemy polecenie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd spark-2.2.0-bin-hadoop2.7/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./bin/run-example SparkPi &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli wszystko poszło tak jak trzeba w wyniku otrzymany stos logów gdzie pod koniec powinniśmy zobaczyć taką wiadomość:&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Pi is roughly 3.1416831416831417&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;Uruchomiliśmy jeden z przykładowych algorytmów zaimplementowanych dla Apache Spark wyliczający liczbę PI.&lt;/p&gt;&#xA;&lt;p&gt;Gdybyśmy chcieli uruchomić powyższy przykład wykorzystując zamiast języka &lt;em&gt;Scala&lt;/em&gt; język &lt;em&gt;Python&lt;/em&gt; musimy w konsoli wpisać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./bin/spark-submit examples/src/main/python/pi.py &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;otrzymując w wyniku:&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;Pi is roughly 3.144064&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;p&gt;Podobnie można postąpić w przypadku języka R:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./bin/spark-submit examples/src/main/r/dataframe.R&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Uwaga, Api dla języka R jest wciąż oznaczone jako eksperymentalne i zawiera tylko podzbiór możliwości Sparka, ale o różnicach w API dla różnych języków w innym poście.)&lt;/p&gt;&#xA;&lt;h1 id=&#34;uruchomienie-w-trybie-interaktywnym&#34;&gt;Uruchomienie w trybie interaktywnym&#xA;&lt;/h1&gt;&lt;p&gt;W poprzednim przykładzie zadanie zostało uruchomienie w sparku za pomocą skryptu &lt;em&gt;spark-submit&lt;/em&gt; (&lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/submitting-applications.html%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/submitting-applications.html)&lt;/a&gt;, czyli nasze zadanie (w tym przypadku zadanie z przykładów) zostało w całości wysłane do Sparka i przez niego uruchomione.&lt;/p&gt;&#xA;&lt;p&gt;Istnieje jednak możliwość uruchomienia Sparka lokalnie w trybie interaktywnym, gdzie Spark linijka po linijce będzie wykonywał nasze polecenia. Tryb ten jest tak naprawdę modyfikacją trybu interaktywnego języka Scala.&lt;/p&gt;&#xA;&lt;p&gt;Aby włączyć tryb interaktywny dla języka &lt;em&gt;Scala&lt;/em&gt; należy w konsoli wykonać polecenia:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./bin/spark-shell --master local&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;dla języka Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./bin/pyspark --master local&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;zaś dla języka R:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./bin/sparkR --master local&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Uwaga, język &lt;em&gt;Java&lt;/em&gt; dopiero od wersji 9 udostępnia tryb interaktywny, dlatego nie jest on jeszcze dostępny w Sparku, niemniej język Scala jest kompatybilny z językiem Java, więc z powodzeniem można użyć tego trybu do pracy z językiem Java).&lt;/p&gt;&#xA;&lt;p&gt;Parametr &amp;ldquo;master&amp;rdquo; pozwala nam zdefiniować w ilu wątkach będzie uruchomiony Spark (local[2] oznacza dwa wątki) a także możliwość podłączenia się do uruchomionego wcześniej Sparka (&lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/submitting-applications.html#master-urls%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/submitting-applications.html#master-urls)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;panel-www-sparka&#34;&gt;Panel WWW Spark&amp;rsquo;a&#xA;&lt;/h1&gt;&lt;p&gt;Po uruchomieniu Spark&amp;rsquo;a (także w trybie interaktywnym) możemy wejść na jego interfejs graficzny dostępny pod adresem http://localhost:4040.&lt;/p&gt;&#xA;&lt;h1 id=&#34;idea-sparka&#34;&gt;Idea Sparka&#xA;&lt;/h1&gt;&lt;p&gt;Spark od początku istnienia opiera się na idei &lt;em&gt;Resilient Distributed Dataset&lt;/em&gt; (RDD) która została po raz pierwszy przedstawiona w publikacji naukowej &lt;em&gt;Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing&lt;/em&gt; autorstwa twórcy narzędzia Matei Zaharia w 2012 roku (&lt;a class=&#34;link&#34; href=&#34;https://cs.stanford.edu/~matei/papers/2012/nsdi_spark.pdf%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cs.stanford.edu/~matei/papers/2012/nsdi_spark.pdf)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;RDD to tak naprawdę niezmienna (brak edycji) rozproszona kolekcja danych, przechowywana przez węzły klastra obliczeniowego. RDD mogą być przetwarzane w sposób rozproszony i wielowątkowy, zaś podstawowymi operacjami na RDD są akcje i transformacje.&lt;/p&gt;&#xA;&lt;p&gt;Wraz z rozwojem Spark&amp;rsquo;a oraz wzrostem jego popularności, twórcy chcieli udostępnić narzędzie szerszemu gronu użytkowników poprzez rozszerzenie API. Na wzór &amp;ldquo;data frames&amp;rdquo; dostępnych w języku R oraz Python (Pandas) twórcy Apache Spark stworzyli nowy typ zwany &lt;em&gt;DataFrame&lt;/em&gt;. Podobnie do RDD, DataFrame to rozproszona kolekcja danych, jednakże dane są zorganizowane w nazwane kolumny, analogicznie jak to ma miejsce w bazach danych czy narzędziach typu Apache Hive. Dodatkowo DataFrame posiadają wiele optymalizacji (Catalyst optimizer) i udogodnień w API (domain-specific language). Także podobnie do RDD wszelkie operacje są buforowane i wykonywane dopiero gdy to niezbędne (lazy), przez co Spark może zastosować wiele optymalizacji.&lt;/p&gt;&#xA;&lt;p&gt;W wersji 1.6 Apache Spark zostało wprowadzone trzecie API zwane Dataset. W przeciwieństwie do DataFrame, nowe Api jest silnie typowane (type-safe) oraz zorientowane obiektowo (object-oriented programming interface). Dodatkowo posiada jeszcze więcej optymalizacji (Catalyst Optimizer i Tungsten project). Użytkowo API jest bardzo zbliżone do RDD, przez co Dataset stał się optymalnym rozwiązaniem łączącym zalety zarówno DataFrame jak i RDD, przy dużo większej wydajności i mniejszym użyciu pamięci RAM niż RDD.&lt;/p&gt;&#xA;&lt;p&gt;Wraz z pojawieniem się wersji 2.0 Spark&amp;rsquo;a, API dla DataFrame i Dataset zostało zunifikowane w pewnym stopniu, dzięki czemu korzystanie z nich stało się znacznie prostsze. Niestety względu na specyfikę języków programowania, nie każde API jest dostępne dla każdego języka, co przedstawia tabela:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Język&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Dostępne API&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Scala&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dataset[T] &amp;amp; DataFrame (alias, DataFrame = Dataset[Row])&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Java&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Dataset[T]&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Python&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;DataFrame&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;R&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;DataFrame&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Jak widać silnie typowany język Java obsługuje Datset, zaś przeciwny jemu Python i R powinien korzystać z DataFrame. W języku Scala możemy korzystać z obydwu API. Trzeba zauważyć, że wraz z unifikacją API typ DataFrame to tak naprawdę alias dla typu Dataset[Row].&lt;/p&gt;&#xA;&lt;p&gt;Podsumowując, jeśli korzystamy ze Sparka, twórcy zalecają korzystanie z Dataset lub DataFrame ze względu na optymalizacje i wygodniejsze API. Jeśli jednak potrzebujemy API niższego poziomu i możemy pominąć optymalizacje wykorzystane w Dataset lub DataFrame, możemy nadal korzystać z klasycznych RDD.&lt;/p&gt;&#xA;&lt;h1 id=&#34;pierwsze-kroki&#34;&gt;Pierwsze kroki&#xA;&lt;/h1&gt;&lt;p&gt;Zacznijmy od wczytania jakiegoś pliku z lokalnego dysku:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scala&amp;gt; val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.read.textFile&lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile: org.apache.spark.sql.Dataset&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;String&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;value: string&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;w wyniku Shell języka Scala informuje nas o stworzeniu wartości (val) typu Dataset (org.apache.spark.sql.Dataset[String]) i nazwie &amp;ldquo;textFile&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Na takim obiekcie możemy wykonywać wiele operacji, np:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Java&#34; data-lang=&#34;Java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark.&lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;textFile&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile.&lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile.&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;val linesWithSpark &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile.&lt;span style=&#34;color:#a6e22e&#34;&gt;filter&lt;/span&gt;(line &lt;span style=&#34;color:#f92672&#34;&gt;=&amp;gt;&lt;/span&gt; line.&lt;span style=&#34;color:#a6e22e&#34;&gt;contains&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Spark&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;linesWithSpark.&lt;span style=&#34;color:#a6e22e&#34;&gt;count&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;linesWithSpark.&lt;span style=&#34;color:#a6e22e&#34;&gt;first&lt;/span&gt;()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W powyższym programie po wczytaniu pliku &amp;ldquo;README.md&amp;rdquo; (który znajduje się w bieżącej lokalizacji, czyli w rozpakowanym katalogu Apache Spark) zliczyliśmy liczbę wierszy za pomocą funkcji &lt;em&gt;count&lt;/em&gt; oraz zwróciliśmy pierwszy element kolekcji, czyli w naszym przypadku pierwszą linijkę. Następnie stworzyliśmy nowy &lt;em&gt;Dataset&lt;/em&gt; za pomocą funkcji &lt;em&gt;filter&lt;/em&gt; którą wybraliśmy tylko te wiersze które zawierają słowo &amp;ldquo;Spark&amp;rdquo;. Z racji że funkcja &lt;em&gt;filter&lt;/em&gt; zwraca kolejny Dataset, na nim także można wywołać funkcje takie jak &lt;em&gt;first&lt;/em&gt; oraz &lt;em&gt;count&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Te same operacje bardzo łatwo możemy wykonać używając języka Python:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python&#34; data-lang=&#34;Python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; spark&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;read&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;README.md&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;textFile&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;linesWithSpark &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; textFile&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;filter(textFile&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;value&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;contains(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Spark&amp;#34;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;linesWithSpark&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;count()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;linesWithSpark&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;first()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W przypadku języka Python kod wygląda prawie identycznie, z tym wyjątkiem, że w tym przypadku używany jest oczywiście typ DataFrame. Także sam shell nie zwraca informacji o stworzonych obiektach, jak to się dzieje w przypadku shell&amp;rsquo;a dla języka Scala.&lt;/p&gt;&#xA;&lt;h1 id=&#34;podsumowanie&#34;&gt;Podsumowanie&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli udało Ci się zainstalować i uruchomić Apache Spark na swoim komputerze, jesteś na dobrej drodze do poznania tego narzędzia. W kolejnych postach przedstawię znacznie więcej informacji Apache Spark, w tym informacje o architekturze, zasadzie działania, instalacji na klastrze i programowaniu.&lt;/p&gt;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;Strona projektu &lt;a class=&#34;link&#34; href=&#34;http://spark.apache.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://spark.apache.org&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Strona pobierania &lt;a class=&#34;link&#34; href=&#34;http://spark.apache.org/downloads.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://spark.apache.org/downloads.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Dokumentacja &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Wysyłanie zadania &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/submitting-applications.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/submitting-applications.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Parametry dla trybu interaktywnego &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/submitting-applications.html#master-urls&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/submitting-applications.html#master-urls&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Scala &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/scala/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/scala/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Java &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/java/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/java/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka Python &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/python/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/python/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API dla języka R &lt;a class=&#34;link&#34; href=&#34;https://spark.apache.org/docs/latest/api/R/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://spark.apache.org/docs/latest/api/R/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;DataFrame &lt;a class=&#34;link&#34; href=&#34;https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Dataset &lt;a class=&#34;link&#34; href=&#34;https://databricks.com/blog/2016/01/04/introducing-apache-spark-datasets.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://databricks.com/blog/2016/01/04/introducing-apache-spark-datasets.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;RDD vs Dataframe vs Dataset &lt;a class=&#34;link&#34; href=&#34;https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Wprowadzenie do Apache Spark</title>
            <link>https://bigdatapassion.pl/blog/wprowadzenie-do-apache-spark/</link>
            <pubDate>Sat, 29 Jul 2017 13:18:32 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/wprowadzenie-do-apache-spark/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/featured/Apache_Spark_logo.svg.png&#34; alt=&#34;Featured image of post Wprowadzenie do Apache Spark&#34; /&gt;&lt;p&gt;Apache Spark to platforma obliczeniowa stworzona z myślą o przetwarzaniu danych.&lt;/p&gt;&#xA;&lt;p&gt;Spark powstał jako odpowiedź na ograniczenia paradygmatu MapReduce wykorzystywanym przez projekt Apache Hadoop który z założenia przetwarza dane w trybie wsadowym, to znaczy między innymi, że za każdym razem wczytuje i zapisuje je na dysk (HDFS) przez co jego wydajność w algorytmach iteracyjnych jest dość ograniczona. W Apache Spark została wprowadzona idea &lt;em&gt;Resilient Distributed Dataset&lt;/em&gt; czyli zbiorów danych które są przechowywane w pamięci dzięki czemu mogą być wykorzystane przez kolejne algorytmy bądź iteracje bez potrzeby ich ponownego wczytywania z dysku. Oczywiście konsekwencją jest znaczne zużycie pamięci RAM w naszym klastrze i jeśli wielkość przetwarzanych danych znacząco przerasta wielkość pamięci operacyjnej na klastrze, Spark potrafi przechowywać je korzystając z dysków twardych podobnie jak to robi Apache Hadoop MapReduce.&lt;/p&gt;&#xA;&lt;p&gt;Autorem Apache Spark jest Matei Zaharia będący pracownikiem naukowych uniwersytetu Stanforda (&lt;a class=&#34;link&#34; href=&#34;https://www.stanford.edu/%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.stanford.edu/)&lt;/a&gt;. Spark powstał jako element pracy naukowej jego autora, dokładnie studiów doktoranckich, na uniwersytecie Berkeley (&lt;a class=&#34;link&#34; href=&#34;http://www.berkeley.edu/%29&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.berkeley.edu/)&lt;/a&gt;, zaś idea RDD została po raz pierwszy przez Niego przedstawiona w publikacji naukowej &lt;em&gt;Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing&lt;/em&gt; (&lt;a class=&#34;link&#34; href=&#34;https://cs.stanford.edu/~matei/papers/2012/nsdi_spark.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cs.stanford.edu/~matei/papers/2012/nsdi_spark.pdf&lt;/a&gt;) w 2012 roku. Matei Zaharia jest także współautorem Apache Mesos oraz brał udział przy tworzeniu niektórych algorytmów w narzędziu Apache Hadoop. Obecnie projekt jest rozwijany pod patronatem fundacji Apache głównie przez założoną przez autora firmę Databricks. Pierwszy raz Spark został wydany 30 maja 2014 roku.&lt;/p&gt;&#xA;&lt;p&gt;Apache Spark można zainstalować w wersji rozproszonej za pomocą natywnej implementacji (opartej o Akka), narzędzia Apache Mesos oraz Hadoop YARN.&lt;/p&gt;&#xA;&lt;p&gt;Dane można wczytywać z lokalnego dysku lub rozproszonych systemów składowania danych jak Hadoop Distributed File System (HDFS), MapR File System (MapR-FS), Cassandra, OpenStack Swift, Amazon S3, Kudu i innych, a nawet zaimplementować własny sterownik do obsługi zewnętrznych źródeł danych lub znaleźć gotową implementację w sieci.&lt;/p&gt;&#xA;&lt;p&gt;Apache Spark został napisany w języku Scala, jednak udostępnia wsparcie (tak zwane API) dla języka &lt;em&gt;Scala&lt;/em&gt;, &lt;em&gt;Java&lt;/em&gt;, &lt;em&gt;Python&lt;/em&gt; oraz &lt;em&gt;R&lt;/em&gt;, jednakże API dla języka Scala udostępnia najwięcej możliwości.&lt;/p&gt;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda:&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;Uniwersytet Berkeley &lt;a class=&#34;link&#34; href=&#34;http://www.berkeley.edu/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://www.berkeley.edu/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Uniwersytet Stanforda &lt;a class=&#34;link&#34; href=&#34;https://www.stanford.edu/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.stanford.edu/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Strona domowa Matei Zaharia &lt;a class=&#34;link&#34; href=&#34;http://cs.stanford.edu/~matei/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://cs.stanford.edu/~matei/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Publikacja na temat RDD &lt;a class=&#34;link&#34; href=&#34;https://cs.stanford.edu/~matei/papers/2012/nsdi_spark.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cs.stanford.edu/~matei/papers/2012/nsdi_spark.pdf&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Strona domowa projektu &lt;a class=&#34;link&#34; href=&#34;http://spark.apache.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://spark.apache.org&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Sandbox Big Data</title>
            <link>https://bigdatapassion.pl/blog/sandbox-big-data/</link>
            <pubDate>Fri, 07 Jul 2017 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/sandbox-big-data/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/hortonworks-logo.png&#34; alt=&#34;Featured image of post Sandbox Big Data&#34; /&gt;&lt;p&gt;W dzisiejszym poście chciałbym Wam udostępnić maszynę wirtualną z którą można łatwo rozpocząć swoją przygodę z Big Data. Wiele osób uczestniczących w naszych kursach Big Data i Data Science narzeka, że dla początkujących osób często problemem jest zestawienia sobie odpowiedniego środowiska.&lt;/p&gt;&#xA;&lt;p&gt;By wyjść naprzeciw tym wszystkim osobom przygotowałem specjalną maszynę wirtualną która zawiera:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;System CentOS 7.5&lt;/li&gt;&#xA;&lt;li&gt;Java&lt;/li&gt;&#xA;&lt;li&gt;Scala&lt;/li&gt;&#xA;&lt;li&gt;IntelliJ IDEA&lt;/li&gt;&#xA;&lt;li&gt;Docker&lt;/li&gt;&#xA;&lt;li&gt;Docker Compose&lt;/li&gt;&#xA;&lt;li&gt;Git&lt;/li&gt;&#xA;&lt;li&gt;Maven&lt;/li&gt;&#xA;&lt;li&gt;Dystrybucja Hortonworks&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;oraz wiele innych przydatnych narzędzi. W środku wrzucony jest także nasz otwarto źródłowy projekt: &lt;a class=&#34;link&#34; href=&#34;https://github.com/sagespl/HADOOP&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/sagespl/HADOOP&lt;/a&gt; oraz przykładowe dane do pracy.&lt;/p&gt;&#xA;&lt;h1 id=&#34;praca-w-środowisku-graficznym&#34;&gt;Praca w środowisku graficznym&#xA;&lt;/h1&gt;&lt;p&gt;Najłatwiej zacząć pracę z samą maszyną w środowisku graficznym. W tym celu należy ją jedynie uruchomić i zalogować się jako:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;user: sages&lt;/li&gt;&#xA;&lt;li&gt;pass: hadoop&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Do dyspozycji mamy GNOME 3, bardzo ergonomiczny manager do codziennej pracy.&lt;/p&gt;&#xA;&lt;h1 id=&#34;praca-z-ssh&#34;&gt;Praca z SSH&#xA;&lt;/h1&gt;&lt;p&gt;Do maszyny można też połączyć się&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@localhost -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dzięki SSH można też tunelować sobie niektóre porty (inaczej mówiąc mapować porty z maszyny wirtualnej na nasz komputer)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@localhost -L 8020:localhost:8020 -L 50070:localhost:50070 -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@localhost -L 8020:localhost:8020 -L 50070:localhost:50070 -L 2181:localhost:2181 -L 16000:localhost:16000 -L 16020:localhost:16020 -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@localhost -L 9092:localhost:9092 -L 9093:localhost:9093 -L 9094:localhost:9094 -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli nie chcemy wpisywać za każdym razem ciągu znaków jak wyżej, możemy sobie całość zdefiniować w pliku &lt;em&gt;~/.ssh/config&lt;/em&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Host bigdatasandbox&#xA;    Hostname localhost&#xA;    Port 2222&#xA;    User root&#xA;    LocalForward 8020 localhost:8020&#xA;    LocalForward 50070 localhost:50070&#xA;    LocalForward 9092 localhost:9092&#xA;    LocalForward 6667 localhost:6667&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Możemy po ssh także zamontować sobie dysk z maszyny w naszym własnym (można też użyć odpowiednich opcji z VirtualBoxa)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir /tmp/sages&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sshfs sages@localhost:/home/sages /tmp/sages/ -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt; -o cache_timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;80&lt;/span&gt; -f -o allow_other -o no_remote_lock&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;mapowanie-portów&#34;&gt;Mapowanie portów&#xA;&lt;/h1&gt;&lt;p&gt;W maszynie jest zainstalowana dystrybucja Big Data firmy Hortonworks tak zwana Hortonworks Data Platform która pracuje na następujących portach:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.2/bk_reference/content/reference_chap2.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.2/bk_reference/content/reference_chap2.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://hortonworks.com/tutorial/sandbox-port-forwarding-guide/section/1/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://hortonworks.com/tutorial/sandbox-port-forwarding-guide/section/1/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Ambari jest dostępne na porcie &lt;em&gt;8080&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://sandbox.hortonworks.com:8080&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://sandbox.hortonworks.com:8080&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;W maszynie wirtualnej wystawione są następujące porty:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SSH&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ambari&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;NameNodeHttp&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;NameNodeHttps&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;NameNodeMetadata&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeHttp&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeHttps&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeData&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeDatas&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeMetadata&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SecondaryNameNodeHttp&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ResourceManagerUI&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;JobHistoryUI&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Zookeeper&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HMaster&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HMasterInfoWebUI&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RegionServer&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RegionServerInfo&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SparkHistoryUI&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Spark2HistoryUI&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Oozie&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Kafka&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 delete &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;KafkaAmbari&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage showvminfo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; | grep Rule&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SSH,tcp,127.0.0.1,2222,,22&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Ambari,tcp,127.0.0.1,8080,,8080&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#VBoxManage modifyvm &amp;#34;Big Data Sandbox&amp;#34; --natpf1 &amp;#34;NameNodeHttp,tcp,127.0.0.1,50070,,50070&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;NameNodeHttps,tcp,127.0.0.1,50470,,50470&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#VBoxManage modifyvm &amp;#34;Big Data Sandbox&amp;#34; --natpf1 &amp;#34;NameNodeMetadata,tcp,127.0.0.1,8020,,8020&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeHttp,tcp,127.0.0.1,50075,,50075&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeHttps,tcp,127.0.0.1,50475,,50475&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeData,tcp,127.0.0.1,50010,,50010&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeDatas,tcp,127.0.0.1,1019,,1019&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;DataNodeMetadata,tcp,127.0.0.1,50020,,50020&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SecondaryNameNodeHttp,tcp,127.0.0.1,50090,,50090&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ResourceManagerUI,tcp,127.0.0.1,8088,,8088&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;JobHistoryUI,tcp,127.0.0.1,19888,,19888&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Zookeeper,tcp,127.0.0.1,2181,,2181&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HMaster,tcp,127.0.0.1,16000,,16000&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HMasterInfoWebUI,tcp,127.0.0.1,16010,,16010&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RegionServer,tcp,127.0.0.1,16020,,16020&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;RegionServerInfo,tcp,127.0.0.1,16030,,16030&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;SparkHistoryUI,tcp,127.0.0.1,18080,,18080&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Spark2HistoryUI,tcp,127.0.0.1,18081,,18081&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage modifyvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --natpf1 &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Oozie,tcp,127.0.0.1,11000,,11000&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#VBoxManage modifyvm &amp;#34;Big Data Sandbox&amp;#34; --natpf1 &amp;#34;Kafka,tcp,127.0.0.1,9092,,9092&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#VBoxManage modifyvm &amp;#34;Big Data Sandbox&amp;#34; --natpf1 &amp;#34;KafkaAmbari,tcp,127.0.0.1,6667,,6667&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage showvminfo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; | grep Rule&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;uruchomienie-maszyny&#34;&gt;Uruchomienie maszyny&#xA;&lt;/h1&gt;&lt;p&gt;Możemy to zrobić z GUI programu VirtualBox lub z konsoli:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage startvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;VBoxManage startvm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Big Data Sandbox&amp;#34;&lt;/span&gt; --type headless&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Instalacja dystrybucji Hortonworks Data Platform za pomocą Apache Ambari</title>
            <link>https://bigdatapassion.pl/blog/instalacja-dystrybucji-hortonworks-data-platform-za-pomoc%C4%85-apache-ambari/</link>
            <pubDate>Mon, 03 Jul 2017 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/instalacja-dystrybucji-hortonworks-data-platform-za-pomoc%C4%85-apache-ambari/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/hortonworks-logo.png&#34; alt=&#34;Featured image of post Instalacja dystrybucji Hortonworks Data Platform za pomocą Apache Ambari&#34; /&gt;&lt;p&gt;Instrukcja instalacji dystrybucji Hortonworks Data Platform HDP-2.6 na maszynach z systemem Red Hat 7 lub CentOS 7.&lt;/p&gt;&#xA;&lt;p&gt;Do instalacji zostanie użyte:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;HDP-2.6.3.0&lt;/li&gt;&#xA;&lt;li&gt;Apache Ambari w wersji 2.5.1.0.&lt;/li&gt;&#xA;&lt;li&gt;CentOS 7.5.1804 (Minimal ISO)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Instalacja może być przeprowadzona tylko na jednej maszynie oraz w klastrze. W przypadku jednej maszyny należy w każdym miejscu konfiguracji wskazać jeden i ten sam host. Wszystko usługi, zarówno typu master jak i slave, będą zainstalowane na tym jednym komputerze.&lt;/p&gt;&#xA;&lt;p&gt;W przypadku systemów produkcyjnych jedyną zalecaną opcją jest instalacja w klastrze kilku maszyn. Jedną maszynę możemy wykorzystywać do celów testowych i developerskich.&lt;/p&gt;&#xA;&lt;h1 id=&#34;przygotowanie-maszyn&#34;&gt;Przygotowanie maszyn&#xA;&lt;/h1&gt;&lt;p&gt;Taką instalację możemy przeprowadzić w dowolnym środowisku, np. z użyciem &lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/virtualbox-installing-cluster-with-centos&#34; &gt;VirtualBoxa&lt;/a&gt; lub chmury &lt;a class=&#34;link&#34; href=&#34;aws-installing-cluster-with-centos.md&#34; &gt;AWS&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;klaster-ssh&#34;&gt;Klaster ssh&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli chcemy wykonywać wybrane polecenia jednocześnie na wszystkich maszynach możemy użyć polecenia &lt;em&gt;cssh&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cssh root@hdp1 root@hdp2 root@hdp3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli wolimy klasyczne ssh, logujemy się na każdą maszynę oddzielnie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@hdp1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UWAGA: Wszystkie dalsze polecenia wykonujemy zalogowani jako użytkownik &lt;em&gt;root&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;dostęp-do-internetu&#34;&gt;Dostęp do internetu&#xA;&lt;/h2&gt;&lt;p&gt;Żeby instalować dodatkowe pakiety musimy mieć dostęp do internetu. Jeśli nie jest on dostępny, można spróbować włączyć DHCP.&lt;/p&gt;&#xA;&lt;p&gt;Aby włączyć ręcznie DHCP należy wykonać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhclient -v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W celu skonfigurowania tego na stałe warto zmienić wartość (ONBOOT=yes) w pliku /etc/sysconfig/network-scripts/ifcfg-eth0&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y vim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/sysconfig/network-scripts/ifcfg-enp0s3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;włączamy-logowanie-roota-po-haśle&#34;&gt;Włączamy logowanie root&amp;rsquo;a po haśle&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli chcemy umożliwić logowanie użytkownika &lt;em&gt;root&lt;/em&gt; po haśle ustawiamy parametr (PermitRootLogin yes) w pliku /etc/ssh/sshd_config&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/ssh/sshd_config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(UWAGA nigdy tego nie róbmy na produkcyjnych serwerach, NIGDY!)&lt;/p&gt;&#xA;&lt;h2 id=&#34;logowanie-po-ssh&#34;&gt;Logowanie po SSH&#xA;&lt;/h2&gt;&lt;p&gt;Jeśli korzystamy z systemów Linux/Mac wygodnym rozwiązaniem może okazać się konfiguracja dostępu z swojego komputer i swojej konsoli. Żeby nie musieć podawać przy logowaniu ciągle hasła, warto wrzucić na maszynę wirtualną swój klucz publiczny by logować się bez hasła.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-copy-id root@localhost -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@localhost -p &lt;span style=&#34;color:#ae81ff&#34;&gt;2222&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;aktualizacja-systemu&#34;&gt;Aktualizacja systemu&#xA;&lt;/h2&gt;&lt;p&gt;Żeby pracować na najnowszej wersji systemu należy go zaktualizować&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y upgrade&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalacja-epel-release&#34;&gt;Instalacja epel release&#xA;&lt;/h2&gt;&lt;p&gt;CentOS:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y epel-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Red Hat:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /tmp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y wget&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y epel-release-latest-7.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum repolist&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalacja-kolejnych-przydatnych-narzędzi&#34;&gt;Instalacja kolejnych przydatnych narzędzi&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install wget vim htop ntp openssh-server openssh-clients nano bash-completion tree mc byobu ncdu&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;zmieniamy-hostname-opcjonalnie&#34;&gt;Zmieniamy hostname (opcjonalnie)&#xA;&lt;/h2&gt;&lt;p&gt;Uwaga, ustawiamy nowe wpisy hostname tylko i wyłącznie wtedy gdy chcemy je zmienić na własne. W wielu przypadkach możemy zostawić obecne hosty o ile są jakieś dostępne.&lt;/p&gt;&#xA;&lt;p&gt;Na każdej z maszyn ustawiamy inny hostname, na przykład:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname hdp1.hortonworks.com --static&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname hdp2.hortonworks.com --static&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname hdp3.hortonworks.com --static&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;jeśli mamy jedną maszynę możemy ustawić:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl set-hostname sandbox.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Status możemy sprawdzić&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostnamectl status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname -f&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Polecenie hostname i hostname -f powinny zwracać tą samą wartość.&lt;/p&gt;&#xA;&lt;h2 id=&#34;konfigurujemy-hostów&#34;&gt;Konfigurujemy hostów&#xA;&lt;/h2&gt;&lt;p&gt;Poniższe ustawienie jest nam niezbędne jeśli ustawiliśmy własne wpisy hostname (punkt wyżej) oraz nie mamy żadnego systemu DNS który mógłby informować nasze maszyny jaki hostname odpowiada jakiemu adresowi ip.&lt;/p&gt;&#xA;&lt;p&gt;Żeby maszyny się &amp;ldquo;widziały&amp;rdquo; musimy każdej ustawić odpowiedni hostname:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.201 hdp1 hdp1.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.202 hdp2 hdp2.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.203 hdp3 hdp3.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oczywiście lista zależy od liczby maszyn (w tym przypadku 3) oraz adresach ip które można sprawdzić za pomocą polecenia &amp;ldquo;ip a&amp;rdquo;. Trzeba także pamiętać że &amp;ldquo;swój&amp;rdquo; hostname dodaliśmy w korku poprzednim, więc musimy go pominąć.&lt;/p&gt;&#xA;&lt;p&gt;Dla jednego serwera możemy użyć localhost/127.0.0.1:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;127.0.0.1   sandbox sandbox.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;::1         localhost localhost.localdomain localhost6 localhost6.localdomain6&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;konfigurujemy-logowanie-ssh-bez-hasła&#34;&gt;Konfigurujemy logowanie SSH bez hasła&#xA;&lt;/h2&gt;&lt;p&gt;Hadoop do działania wymaga by użytkownik systemowy mógł logować się do innych maszyn bez hasła za pomocą infrastruktury klucza prywatnego i publicznego, dlatego wykonujemy poniższe polecenia.&lt;/p&gt;&#xA;&lt;p&gt;Na każdej maszynie generujemy zestaw kluczy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Na maszynie hdp1 wyświetlamy sobie klucz publiczny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat .ssh/id_rsa.pub&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pobrany klucz maszyny &lt;em&gt;hdp1&lt;/em&gt; wklejamy na każdej maszynie (także &lt;em&gt;hdp1&lt;/em&gt;) do pliku:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim .ssh/authorized_keys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli wszystko poszło jak trzeba z maszyny &lt;em&gt;hdp1&lt;/em&gt; możemy teraz zalogować się po SSH do każdej innej maszyny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh hdp3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli instalujemy to na jednej maszynie wystarczy wykonać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-copy-id sandbox.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh sandbox.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wyłączamy-selinux&#34;&gt;Wyłączamy selinux&#xA;&lt;/h2&gt;&lt;p&gt;Edytujemy plik /etc/sysconfig/selinux ustawiając SELINUX na disabled.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39;&lt;/span&gt; /etc/sysconfig/selinux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39;&lt;/span&gt; /etc/selinux/config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setenforce &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sestatus&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wyłączamy-firewalla&#34;&gt;Wyłączamy Firewall&amp;rsquo;a&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable firewalld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl stop firewalld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status firewalld&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable firewalld.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl stop firewalld.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status firewalld.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;włączamy-serwer-czasu-ntp&#34;&gt;Włączamy serwer czasu NTP&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y ntp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable chrony.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable ntpd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start ntpd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status ntpd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable ntpd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl is-enabled ntpd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl start ntpd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl status ntpd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;umask&#34;&gt;Umask&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;umask &lt;span style=&#34;color:#ae81ff&#34;&gt;022&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo umask &lt;span style=&#34;color:#ae81ff&#34;&gt;022&lt;/span&gt; &amp;gt;&amp;gt; ~/.bash_profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo umask &lt;span style=&#34;color:#ae81ff&#34;&gt;022&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;restart-maszyn&#34;&gt;Restart maszyn&#xA;&lt;/h2&gt;&lt;p&gt;Teraz warto wykonać restart wszystkich maszyn poleceniem &lt;em&gt;reboot&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-apache-ambari&#34;&gt;Instalacja Apache Ambari&#xA;&lt;/h1&gt;&lt;p&gt;UWAGA: Od teraz wszystkie operacje wykonujemy tylko na maszynie &lt;em&gt;hdp1&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -nv http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.6.1.3/ambari.repo -O /etc/yum.repos.d/ambari.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -nv http://public-repo-1.hortonworks.com/HDP/centos7/2.x/updates/2.6.4.0/hdp.repo -O /etc/yum.repos.d/hdp.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum repolist&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalujemy-ambari&#34;&gt;Instalujemy Ambari&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install ambari-server -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;konfigurujemy-ambari&#34;&gt;Konfigurujemy Ambari&#xA;&lt;/h2&gt;&lt;p&gt;(W każdym pytaniu wybieramy odpowiedź domyślną klikając klawisz &lt;em&gt;Enter&lt;/em&gt; za każdrym razem)&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server setup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W przypadku ambari-server setup upewniamy się, że nie ma żadnych ostrzeżeń, zaś na wszystkie pytania odpowiadamy wartościami domyślnymi klikając enter:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;root@hdp1 ~&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ambari-server setup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Using python  /usr/bin/python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Setup ambari-server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking SELinux...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SELinux status is &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;disabled&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Customize user account &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ambari-server daemon &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Adjusting ambari-server permissions and ownership...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking firewall status...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking JDK...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Oracle JDK 1.8 + Java Cryptography Extension &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;JCE&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Policy Files &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Oracle JDK 1.7 + Java Cryptography Extension &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;JCE&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Policy Files &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Custom JDK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;==============================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter choice &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To download the Oracle JDK and the Java Cryptography Extension &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;JCE&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Policy Files you must accept the license terms found at http://www.oracle.com/technetwork/java/javase/terms/license/index.html and not accepting will cancel the Ambari Server setup and you must install the JDK and JCE files manually.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Do you accept the Oracle Binary Code License Agreement &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downloading JDK from http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-8u112-linux-x64.tar.gz to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jdk-8u112-linux-x64.tar.gz... 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;174.7 MB of 174.7 MB&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully downloaded JDK distribution to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing JDK to /usr/jdk64/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully installed JDK to /usr/jdk64/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downloading JCE Policy archive from http://public-repo-1.hortonworks.com/ARTIFACTS/jce_policy-8.zip to /var/lib/ambari-server/resources/jce_policy-8.zip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully downloaded JCE Policy archive to /var/lib/ambari-server/resources/jce_policy-8.zip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing JCE policy...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Completing setup...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter advanced database configuration &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Default properties detected. Using built-in database.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring ambari database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking PostgreSQL...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Running initdb: This may take up to a minute.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Initializing database ... OK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;About to start PostgreSQL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring local database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring PostgreSQL...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Restarting PostgreSQL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating schema and user...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating tables...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Extracting system views...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-admin-2.5.0.3.7.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...........&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Adjusting ambari-server permissions and ownership...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ambari Server &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;setup&amp;#39;&lt;/span&gt; completed successfully.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;uruchamiamy-ambari&#34;&gt;Uruchamiamy Ambari&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;konfiguracja-klastra-hdp&#34;&gt;Konfiguracja klastra HDP&#xA;&lt;/h1&gt;&lt;p&gt;Następnie wchodzimy na adres: http://hdp1:8080 (lub inny wybrany hostname) i całą instalację kontynuujemy w trybie graficznym. Logujemy się jako admin / admin.&lt;/p&gt;&#xA;&lt;p&gt;Następnie klikamy przycisk &lt;em&gt;Launch Install Wizard&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-lanuch-install.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ustawiamy nazwę naszego klastra&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-cluster-name.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy wersję dystrybucji którą chcemy zainstalować&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-select-version.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym ekranie w polu &lt;em&gt;Target Hosts&lt;/em&gt; wskazujemy pełne adresy wybranych maszyn na których chcemy postawić dystrybucję&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp1.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp2.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp3.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub dla jednej maszyny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sandbox.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz wklejamy zawartość pliku /root/.ssh/id_rsa maszyny na której zainstalowaliśmy Ambari&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-install-options.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po kliknięciu &lt;em&gt;Register and Confirm&lt;/em&gt; Ambari przygotowuje nasze maszyny do instalacji&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-confirm-hosts.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zakończonym procesie powinniśmy dostać informację o udanym przygotowaniu maszyn&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-confirm-hosts-success.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jeśli jednak mamy informację o ostrzeżeniach, należy przejrzeć ich listę i rozwiązać problemy&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-confirm-hosts-error.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Następnie wybieramy narzędzia które chcemy zainstalować (ilość i rodzaj według uznania, np. HDFS, MapReduce2, Tez, Hive, Pig, HBase, Oozie, Flume, Ambari Metrics)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-choose-services.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wskazujemy na których maszynach mają być zainstalowane usługi zarządzające (Masters) (można zostawić na początek proponowane rozmieszczenie)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-assign-masters.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;oraz usługi robocze (Slaves) (wybieramy wszystkie 3 maszyny dla każdej z usług)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-assign-slaves.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Konfigurujemy nasze serwisy, pola wymagane są na czerwono (najczęściej konieczność ustawienia hasła do bazy danych), pozostałe ustawienia na ten moment możemy pozostawić w ich wartościach domyślnych&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-configure.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Akceptujemy ostrzeżenia i dostajemy podsumowanie instalacji&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-review.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na koniec Ambari zaczyna instalować wszystkie usługi zgodnie z naszymi wytycznymi&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/hdp-ambari-install/hdp-install.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zakończonej instalacji możemy korzystać już w pełni wdrożonego klastra.&lt;/p&gt;&#xA;&lt;p&gt;Gdyby w trakcie instalacji wystąpiły jakieś błędy podczas uruchamiania usług, możemy spróbować zatrzymać wszystkie serwisy a następnie ponownie je włączyć. W tym celu w lewym pasku serwisów w menu &lt;em&gt;Actions&lt;/em&gt; wybieramy &lt;em&gt;Stop All&lt;/em&gt; a następnie &lt;em&gt;Start All&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://hortonworks.com/products/data-center/hdp/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://hortonworks.com/products/data-center/hdp/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://ambari.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://ambari.apache.org/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/download_the_ambari_repo_lnx7.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/download_the_ambari_repo_lnx7.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/ambari_repositories.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/ambari_repositories.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://cwiki.apache.org/confluence/display/AMBARI/Installation&amp;#43;Guide&amp;#43;for&amp;#43;Ambari&amp;#43;2.5.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cwiki.apache.org/confluence/display/AMBARI/Installation+Guide+for+Ambari+2.5.0&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari/Ambari-2.6.2.2/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari/Ambari-2.6.2.2/index.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-installation/content/hdp_26_repositories.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-installation/content/hdp_26_repositories.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/rebuilding_oozie_war.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/rebuilding_oozie_war.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/rebuilding_oozie_war.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.6.2.2/bk_ambari-operations/content/rebuilding_oozie_war.html&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>CentOS 7 - Instalacja środowiska developerskiego</title>
            <link>https://bigdatapassion.pl/blog/centos-7-instalacja-%C5%9Brodowiska-developerskiego/</link>
            <pubDate>Sun, 02 Jul 2017 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/centos-7-instalacja-%C5%9Brodowiska-developerskiego/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/linux/centos-logo.png&#34; alt=&#34;Featured image of post CentOS 7 - Instalacja środowiska developerskiego&#34; /&gt;&lt;p&gt;Jeśli ktoś chciałby pracować na co dzień z systemem CentOS 7 w trybie graficznym, poniżej krótka instrukcja jak to zrobić.&lt;/p&gt;&#xA;&lt;p&gt;Dodatkowo opis konfiguracji dla VirtualBox&amp;rsquo;a dla chcącym korzystać tylko na maszynie wirtualnej.&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-systemu&#34;&gt;Instalacja systemu&#xA;&lt;/h1&gt;&lt;p&gt;Proces instalacji systemu jest bardzo prosty, wystarczy postępować zgodnie z poleceniami na ekranie, dlatego zostanie pominięty.&lt;/p&gt;&#xA;&lt;h2 id=&#34;aktualizacja-systemu&#34;&gt;Aktualizacja systemu&#xA;&lt;/h2&gt;&lt;p&gt;Żeby pracować na najnowszej wersji systemu należy go zaktualizować&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y upgrade&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;instalacja-środowiska-graficznego&#34;&gt;Instalacja środowiska graficznego&#xA;&lt;/h1&gt;&lt;h2 id=&#34;instalacja-pakietów-i-narzędzi&#34;&gt;Instalacja pakietów i narzędzi&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y groups install &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GNOME Desktop&amp;#34;&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli chcemy przejrzeć inne grupy możemy wpisać:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum groups summary&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum group list ids &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum group list&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Żeby zobaczyć zawartość grupy należy wpisać w terminalu:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum group info &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GNOME Desktop&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;instalacja-przydatnych-narzędzi&#34;&gt;Instalacja przydatnych narzędzi&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y epel-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install wget vim htop ntp openssh-server openssh-clients nano bash-completion tree mc byobu ncdu&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install gnome-system-monitor firefox git gedit &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install gnome-tweak-tool &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dodawanie-użytkownika&#34;&gt;Dodawanie użytkownika&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adduser sages&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;passwd sages&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restartujemy maszynę&lt;/p&gt;&#xA;&lt;h2 id=&#34;uruchomienie-trybu-graficznego&#34;&gt;Uruchomienie trybu graficznego&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;startx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;uruchomienie-domyślnie-w-trybie-graficznym&#34;&gt;Uruchomienie domyślnie w trybie graficznym&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl set-default graphical.target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;virtualbox&#34;&gt;VirtualBox&#xA;&lt;/h1&gt;&lt;h2 id=&#34;instalacja-dodatków-dla-virtualbox-guest&#34;&gt;Instalacja dodatków dla Virtualbox Guest&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install kernel*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install gcc kernel-devel kernel-headers dkms make bzip2 perl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;instalacja-dockera-i-docker-compose&#34;&gt;Instalacja Dockera i Docker Compose&#xA;&lt;/h1&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/install/linux/docker-ce/centos/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.docker.com/install/linux/docker-ce/centos/&lt;/a&gt;&#xA;&lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/compose/install/#install-compose&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.docker.com/compose/install/#install-compose&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;docker-bez-roota&#34;&gt;Docker bez root&amp;rsquo;a&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli chcemy by inny użytkownik niż &lt;em&gt;root&lt;/em&gt; mógł wykonywać polecenia dockera, należy dać mu uprawnienia sudo do polecenia docker. Należy wtedy dodać wpis do pliku &lt;em&gt;/etc/sudoers&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sages        ALL=(ALL)       NOPASSWD: /usr/bin/docker&#xA;sages        ALL=(ALL)       NOPASSWD: /usr/local/bin/docker-compose&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;warto przy okazji dadać aliasy do pliku &lt;em&gt;~/.bashrc&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;alias docker=&amp;#34;sudo /usr/bin/docker&amp;#34;&#xA;alias docker-compose=&amp;#34;sudo /usr/local/bin/docker-compose&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;instalacja-dodatkowych-narzędzi&#34;&gt;Instalacja dodatkowych narzędzi&#xA;&lt;/h1&gt;&lt;h2 id=&#34;instalacja-mysql&#34;&gt;Instalacja MySQL&#xA;&lt;/h2&gt;&lt;p&gt;Aktualnie większość systemów Linux dostarcza domyślnie pakiety dla MariaDB a nie MySQL&amp;rsquo;a z którego korzysta Ambari, dlatego musimy pobrać najnowszą wersję ze strony: &lt;a class=&#34;link&#34; href=&#34;https://dev.mysql.com/downloads/repo/yum/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://dev.mysql.com/downloads/repo/yum/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rpm -Uvh mysql57-community-release-el7-11.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum localinstall mysql57-community-release-el7-11.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gdybyśmy mieli problemy możemy skorzystać z&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum clean all&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum clean dbcache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum clean metadata&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum makecache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Testowy klaster obliczeniowy - Amazon Web Services i CentOS 7</title>
            <link>https://bigdatapassion.pl/blog/testowy-klaster-obliczeniowy-amazon-web-services-i-centos-7/</link>
            <pubDate>Tue, 20 Jun 2017 12:59:11 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/testowy-klaster-obliczeniowy-amazon-web-services-i-centos-7/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/amazon-logo.png&#34; alt=&#34;Featured image of post Testowy klaster obliczeniowy - Amazon Web Services i CentOS 7&#34; /&gt;&lt;p&gt;Publiczne chmury obliczeniowe cieszą się coraz większym zainteresowaniem. Jedną z najbardziej popularnych rozwiązań tego typu jest zdecydowanie Amazon Web Services. W poniższym krótkim tutorialu pokażę jak szybko zbudować mini klaster testowy do zastosowań Big Data, na którym będziemy mogli wdrożyć na przykład platformę HDP (instalacji poświęcony został inny tutorial).&lt;/p&gt;&#xA;&lt;h1 id=&#34;założenie-konta&#34;&gt;Założenie konta&#xA;&lt;/h1&gt;&lt;p&gt;Nasz proces musimy zacząć od założenia konta w serwisie (&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/console/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://aws.amazon.com/console/&lt;/a&gt;) wybierając opcję &amp;ldquo;Sign in to the Console&amp;rdquo; a następnie wybranie opcji &amp;ldquo;I am a new user&amp;rdquo; i wypełnienie formularza.&lt;/p&gt;&#xA;&lt;p&gt;Rejestracja jest dość prosta, jedynym utrudnieniem może się okazać konieczność podania karty kredytowej z której będą dokonywane płatności za comiesięczny rachunek około trzeciego dnia następnego miesiąca. Dodatkowo w momencie rejestracji, w celu potwierdzenia karty kredytowej, zostanie pobrana opłata w wysokości jednego dolara.&lt;/p&gt;&#xA;&lt;h1 id=&#34;planowanie-kosztów&#34;&gt;Planowanie kosztów&#xA;&lt;/h1&gt;&lt;p&gt;Amazon udostępnia możliwość tworzenia maszyn na życzenie (on demand) za które płacimy zgodnie z wykorzystaniem (płatność za godzinę użycia). Aktualny cennik możemy znaleźć pod adresem: &lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/ec2/pricing/on-demand/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://aws.amazon.com/ec2/pricing/on-demand/&lt;/a&gt;. Należy zwrócić uwagę, że ceny zależą od lokalizacji w której będziemy tworzyć maszyny (najtaniej jest w USA, np. Oregon lub Virginia) oraz dostępność wersji maszyn także zależy od kolokacji. Dla przykładu za maszynę m4.xlarge (4 CPU, 16 GB RAM) w Oregon zapłacimy 0.2 $ za godzinę użycia (włącozna maszyna). Dodatkowo naliczane są ceny za wykorzystane powierzchnie dyskowe. Całość naszego wdrożenia, najlepiej sprawdzić za pomocą kalkulatora: &lt;a class=&#34;link&#34; href=&#34;https://calculator.s3.amazonaws.com/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://calculator.s3.amazonaws.com/index.html&lt;/a&gt; wybierając w zakładce EC2 odpowiednie maszyny, ich ilość i planowane wykorzystanie przestrzeni dyskowej.&lt;/p&gt;&#xA;&lt;h1 id=&#34;tworzenie-klastra-maszyn-na-aws&#34;&gt;Tworzenie klastra maszyn na AWS&#xA;&lt;/h1&gt;&lt;p&gt;Poniżej kolejne kroki w celu uzyskania kompletnego klastra obliczeniowego na Amazon Web Services.&lt;/p&gt;&#xA;&lt;p&gt;Całość zaczynamy od wejścia na stronę: &lt;a class=&#34;link&#34; href=&#34;https://console.aws.amazon.com/console/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://console.aws.amazon.com/console/&lt;/a&gt; a następnie z menu usług wybieramy &amp;ldquo;EC2&amp;rdquo;. Powinniśmy zobaczyć ekran jak niżej:&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-ec2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na górze widzimy podsumowanie statusu w ramach aktualnie wybranej lokalizacji którą możemy zmienić w prawym górnych rogu (w moim przypadku jest to Virginia w USA).&lt;/p&gt;&#xA;&lt;p&gt;Jeśli klikniemy menu &amp;ldquo;Running Instances&amp;rdquo; zobaczymy listę maszyn dostępnych w tej lokalizacji (w tym przypadku pustą).&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-before-start-oregon.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Aby stworzyć nowe maszyny klikamy &amp;ldquo;Launch Instances&amp;rdquo;. W wyniku dostajemy listę obrazów systemów do załadowania.&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-machine-image.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W prezentowanej liście brakuje systemu CentOS którego chcemy użyć, dlatego skorzystamy z marketu (AWS Marketplace w menu po lewej) i wbudowanej wyszukiwarki. Wybieramy interesującą nas wersję i klikamy &amp;ldquo;Select&amp;rdquo;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-marketplace.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-marketplace2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po wybraniu odpowiedniego obrazu otrzymujemy jego podsumowanie. Warto przejrzeć zawarte tam informacje, gdyż możemy się dowiedzieć na przykład jak będzie się nazywał domyślny użytkownik na którego mamy się połączyć po SSH oraz czy obraz jest płatny&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-centos.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Następnie przechodzimy do wybrania typu maszyny. Do naszego klastra testowego skorzystamy z maszyn typu &amp;ldquo;m4.xlarge&amp;rdquo; (4 CPU, 16GB RAM)&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-instance-type.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym oknie możemy zdefiniować liczbę maszyn wybranego typu oraz ustawić dodatkowe opcj. Ustawiam 7 maszyn&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-instance-details.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W następnym oknie definiujemy przestrzeń dyskową dla naszych maszyn. W poniższym przykładzie wybrałem dyski magnetyczne o pojemności 100 GB&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-storage.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-storage2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Kolejny krok możemy pominąć, umożliwia on dodanie dodatkowych tagów do maszyn&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-tags.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;AWS promuje wykorzystanie droższych dysków SSD, więc musimy potwierdzić swój wybór dysków HDD (lub wybrać jednak dyski SSD)&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-magnetic.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym kroku definiujemy konfigurację zabezpieczeń (firewall) poprzez stworzenie nowej grupy. Z racji tworzenia klastra testowego otworzę cały ruch do tych maszyn (uwaga, w żadnym wypadku nie należy tego robić produkcyjnie, gdyż każdy będzie miał dostęp do naszych maszyn i usług na wszystkich portach)&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-security.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W ostatnim kroku dostajemy podsumowanie naszej stworzonej konfiguracji wraz z ostrzeżeniem że nasza konfiguracja będzie płatna (przez pierwszy rok korzystania z AWS dostajemy tak zwany &amp;ldquo;free tier&amp;rdquo; czyli pewien limit użycia za który nie musimy płacić). Klikamy &amp;ldquo;Launch&amp;rdquo; by potwierdzić naszą konfigurację.&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-review.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Domyślny użytkownik systemów na AWS nie ma możliwości logowania się hasłem, dlatego w kolejnym kroku jesteśmy proszeni o stworzenie odpowiedniego klucza który posłuży nam do zalogowania się na niego. Ten klucz musimy zapisać na swoim komputerze oraz nikomu go nie udostępniać.&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-keypair.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ostatecznie tworzą się nasze maszyny&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-launch.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;i na koniec dostajemy podsumowanie&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-after-launch.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Klikając &amp;ldquo;View Instances&amp;rdquo; możemy zobaczyć listę naszych maszyn&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/aws-installing-cluster-with-centos/aws-instances.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://alestic.com/2014/01/ec2-ssh-username/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://alestic.com/2014/01/ec2-ssh-username/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://aws.amazon.com/marketplace/pp/B00O7WM7QW&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://aws.amazon.com/marketplace/pp/B00O7WM7QW&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/download_the_ambari_repo_lnx7.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/download_the_ambari_repo_lnx7.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Instalacja dystrybucji Hortonworks Data Platform za pomocą Apache Ambari</title>
            <link>https://bigdatapassion.pl/blog/instalacja-dystrybucji-hortonworks-data-platform-za-pomoc%C4%85-apache-ambari/</link>
            <pubDate>Fri, 05 May 2017 19:24:48 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/instalacja-dystrybucji-hortonworks-data-platform-za-pomoc%C4%85-apache-ambari/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/hortonworks-logo.png&#34; alt=&#34;Featured image of post Instalacja dystrybucji Hortonworks Data Platform za pomocą Apache Ambari&#34; /&gt;&lt;p&gt;Instrukcja instalacji dystrybucji Hortonworks Data Platform HDP-2.6.3.0 na maszynach z systemem Red Hat 6.9 lub CentOS 6.9. Do instalacji zostanie użyte Apache Ambari w wersji 2.5.1.0.&lt;/p&gt;&#xA;&lt;h1 id=&#34;klaster-ssh&#34;&gt;Klaster ssh&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli chcemy wykonywać wybrane polecenia jednocześnie na wszystkich maszynach możemy użyć polecenia &lt;em&gt;cssh&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cssh root@hdp1 root@hdp2 root@hdp3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli wolimy klasyczne ssh, logujemy się na każdą maszynę oddzielnie:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh root@hdp1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;UWAGA: Wszystkie dalesze polecenia wykonujemy zalogowani jako użytkownik &lt;em&gt;root&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;aktualizacja-systemu&#34;&gt;Aktualizacja systemu&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum update -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;instalacja-przydatnych-narzędzi&#34;&gt;Instalacja przydatnych narzędzi&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y wget&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;instalacja-epel-release&#34;&gt;Instalacja epel release&#xA;&lt;/h1&gt;&lt;p&gt;CentOS:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y epel-release&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Red Hat:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /tmp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y epel-release-latest-6.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum repolist&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;instalacja-kolejnych-przydatnych-narzędzi&#34;&gt;Instalacja kolejnych przydatnych narzędzi&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum -y install wget vim htop ntp openssh-server openssh-clients nano bash-completion tree&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;zmieniamy-hostname-opcjonalnie&#34;&gt;Zmieniamy hostname (opcjonalnie)&#xA;&lt;/h1&gt;&lt;p&gt;Ten krok wykonujemy jeśli chcemy zmienić hostname w systemie.&lt;/p&gt;&#xA;&lt;p&gt;Obecny hostname możemy sprawdzić za pomocą:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname -f&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# lub hostname --fqdn&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pierwsze polecenie pokazuje krótszą wartość, drugie pełną nazwę.&lt;/p&gt;&#xA;&lt;p&gt;W celu zmiany edytujemy plik:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/sysconfig/network&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Zmieniamy wartość linijki (odpowiednio na każdej maszynie):&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HOSTNAME=hdp1.hortonworks.com&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pdobnie wpisujemy &amp;ldquo;swój&amp;rdquo; hostname w pliku /etc/hosts&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim /etc/hosts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;na odpowiednią wartość:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;127.0.0.1 hdp1 hdp1.hortonworks.com&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Na koniec wykonujemy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/init.d/network restart&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lub najlepiej restart całego systemu :)&lt;/p&gt;&#xA;&lt;h1 id=&#34;konfigurujemy-hostów&#34;&gt;Konfigurujemy hostów&#xA;&lt;/h1&gt;&lt;p&gt;Żeby maszyny się &amp;ldquo;widziały&amp;rdquo; musimy każdej ustawić odpowiedni hostname:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.201 hdp1 hdp1.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.202 hdp2 hdp2.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.203 hdp3 hdp3.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oczywiście lista zależy od liczby maszyn (w tym przypadku 3) oraz adresach ip które można sprawdzić za pomocą polecenia &amp;ldquo;ip a&amp;rdquo;. Trzeba także pamiętać że &amp;ldquo;swój&amp;rdquo; hostname dodaliśmy w kroku poprzednim, więc musimy go pominąć.&lt;/p&gt;&#xA;&lt;h1 id=&#34;konfigurujemy-logowanie-ssh-bez-hasła&#34;&gt;Konfigurujemy logowanie SSH bez hasła&#xA;&lt;/h1&gt;&lt;p&gt;Na każdem maszynie generujemy zestaw kluczy:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Na maszynie hdp1 wyświetlamy sobie klucz publiczny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat .ssh/id_rsa.pub&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pobrany klucz maszyny &lt;em&gt;hdp1&lt;/em&gt; wklejami na każdej maszynie (także &lt;em&gt;hdp1&lt;/em&gt;) do pliku:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vim .ssh/authorized_keys&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jeśli wszystko poszło jak trzeba z maszyny &lt;em&gt;hdp1&lt;/em&gt; możemy teraz zalogować się po SSH do każdej innej maszyny:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh hdp3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;wyłączamy-selinux&#34;&gt;Wyłączamy selinux&#xA;&lt;/h1&gt;&lt;p&gt;Edytujemy plik /etc/sysconfig/selinux ustawiając SELINUX na disabled.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39;&lt;/span&gt; /etc/sysconfig/selinux&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/SELINUX=enforcing/SELINUX=disabled/g&amp;#39;&lt;/span&gt; /etc/selinux/config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sestatus&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;wyłączamy-firewalla&#34;&gt;Wyłączamy Firewall&amp;rsquo;a&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;service iptables stop&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/init.d/iptables stop&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chkconfig iptables off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;włączamy-serwer-czasu-ntp&#34;&gt;Włączamy serwer czasu NTP&#xA;&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install -y ntp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chkconfig ntpd on&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;umask&#34;&gt;Umask&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo umask &lt;span style=&#34;color:#ae81ff&#34;&gt;022&lt;/span&gt; &amp;gt;&amp;gt; ~/.bash_profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo umask &lt;span style=&#34;color:#ae81ff&#34;&gt;022&lt;/span&gt; &amp;gt;&amp;gt; /etc/profile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;restart-maszyn&#34;&gt;Restart maszyn&#xA;&lt;/h1&gt;&lt;p&gt;Teraz warto wykonać restart wszystkich maszyn poleceniem &lt;em&gt;reboot&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-apache-ambari&#34;&gt;Instalacja Apache Ambari&#xA;&lt;/h1&gt;&lt;p&gt;UWAGA: Od teraz wszystkie operacje wykonujemy tylko na maszynie &lt;em&gt;hdp1&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget -nv http://public-repo-1.hortonworks.com/ambari/centos6/2.x/updates/2.5.1.0/ambari.repo -O /etc/yum.repos.d/ambari.repo&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;yum install ambari-server -y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server setup&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W przypadku ambari-server setup upewniamy się, że nie ma żadnych ostrzeżeń, zaś na wszystkie pytania odpowiadamy wartościami domyślnymi klikając enter:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;root@hdp1 ~&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# ambari-server setup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Using python  /usr/bin/python&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Setup ambari-server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking SELinux...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SELinux status is &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;disabled&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Customize user account &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; ambari-server daemon &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Adjusting ambari-server permissions and ownership...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking firewall status...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking JDK...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Oracle JDK 1.8 + Java Cryptography Extension &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;JCE&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Policy Files &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;2&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Oracle JDK 1.7 + Java Cryptography Extension &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;JCE&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Policy Files &lt;span style=&#34;color:#ae81ff&#34;&gt;7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;3&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; Custom JDK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;==============================================================================&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter choice &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;1&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;To download the Oracle JDK and the Java Cryptography Extension &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;JCE&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; Policy Files you must accept the license terms found at http://www.oracle.com/technetwork/java/javase/terms/license/index.html and not accepting will cancel the Ambari Server setup and you must install the JDK and JCE files manually.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Do you accept the Oracle Binary Code License Agreement &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;y&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downloading JDK from http://public-repo-1.hortonworks.com/ARTIFACTS/jdk-8u112-linux-x64.tar.gz to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jdk-8u112-linux-x64.tar.gz... 100% &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;174.7 MB of 174.7 MB&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully downloaded JDK distribution to /var/lib/ambari-server/resources/jdk-8u112-linux-x64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing JDK to /usr/jdk64/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully installed JDK to /usr/jdk64/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Downloading JCE Policy archive from http://public-repo-1.hortonworks.com/ARTIFACTS/jce_policy-8.zip to /var/lib/ambari-server/resources/jce_policy-8.zip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully downloaded JCE Policy archive to /var/lib/ambari-server/resources/jce_policy-8.zip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Installing JCE policy...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Completing setup...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter advanced database configuration &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;y/n&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;? &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Default properties detected. Using built-in database.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring ambari database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Checking PostgreSQL...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Running initdb: This may take up to a minute.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Initializing database ... OK&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;About to start PostgreSQL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring local database...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Configuring PostgreSQL...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Restarting PostgreSQL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating schema and user...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Creating tables...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;done&lt;/span&gt;.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Extracting system views...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-admin-2.5.0.3.7.jar&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...........&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Adjusting ambari-server permissions and ownership...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Ambari Server &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;setup&amp;#39;&lt;/span&gt; completed successfully.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;uruchamiamy-ambari&#34;&gt;Uruchamiamy Ambari&#xA;&lt;/h1&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ambari-server start&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;konfiguracja-klastra-hdp&#34;&gt;Konfiguracja klastra HDP&#xA;&lt;/h1&gt;&lt;p&gt;Następnie wchodzimy na adres: http://hdp1:8080 i całą instalację kontynuujemy w trybie graficznym. Logujemy się jako admin / admin.&lt;/p&gt;&#xA;&lt;p&gt;Następnie klikamy przycisk &lt;em&gt;Launch Install Wizard&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-lanuch-install.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ustawiamy nazwę naszego klastra&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-cluster-name.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy wersję dystrybucji którą chcemy zainstalować&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-select-version.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym ekranie w polu &lt;em&gt;Target Hosts&lt;/em&gt; wskazujemy pełne adresy wybranych maszyn na których chcemy postawić dystrybucję&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp1.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp2.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdp3.hortonworks.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz wklejamy zawartość pliku /root/.ssh/id_rsa maszyny na której zainstalowaliśmy Ambari&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-install-options.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po kliknięciu &lt;em&gt;Register and Confirm&lt;/em&gt; Ambari przygotowuje nasze maszyny do instalacji&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-confirm-hosts.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zakończonym procesie powinniśmy dostać informację o udanym przygotowaniu maszyn&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-confirm-hosts-success.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Jeśli jednak mamy informację o ostrzeżeniach, należy przejrzeć ich listę i rozwiązać problemy&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-confirm-hosts-error.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Następnie wybieramy narzędzia które chcemy zainstalować (ilość i rodzaj według uznania, np. HDFS, MapReduce2, Tez, Hive, Pig, HBase, Oozie, Flume, Ambari Metrics)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-choose-services.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wskazujemy na których maszynach mają być zainstalowane usługi zarządzające (Masters) (można zostawić na początek proponowane rozmieszczenie)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-assign-masters.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;oraz usługi robocze (Slaves) (wybieramy wszystkie 3 maszyny dla każdej z usług)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-assign-slaves.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Konfigurujemy nasze serwisy, pola wymagane są na czerwono (najczęściej konieczność ustawienia hasła do bazy danych), pozostałe ustawienia na ten moment możemy pozostawić w ich wartościach domyślnych&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-configure.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Akceptujemy ostrzeżenia i dostajemy podsumowanie instalacji&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-review.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Na koniec Ambari zaczyna instalować wszystkie usługi zgodnie z naszymi wytycznymi&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/devops/hdp-ambari-install/hdp-install.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po zakończonej instalacji możemy korzystać już w pełni wdrożonego klastra.&lt;/p&gt;&#xA;&lt;p&gt;Gdyby w trakcie instalacji wystąpiły jakieś błędy podczas uruchamiania usług, możemy spróbować zatrzymać wszystkie serwisy a następnie ponownie je włączyć. W tym celu w lewym pasku serwisów w menu &lt;em&gt;Actions&lt;/em&gt; wybieramy &lt;em&gt;Stop All&lt;/em&gt; a następnie &lt;em&gt;Start All&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://hortonworks.com/products/data-center/hdp/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://hortonworks.com/products/data-center/hdp/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://ambari.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://ambari.apache.org/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/download_the_ambari_repo_lnx7.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.1.0/bk_ambari-installation/content/download_the_ambari_repo_lnx7.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.0.3/bk_ambari-installation/content/ambari_repositories.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.hortonworks.com/HDPDocuments/Ambari-2.5.0.3/bk_ambari-installation/content/ambari_repositories.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://cwiki.apache.org/confluence/display/AMBARI/Installation&amp;#43;Guide&amp;#43;for&amp;#43;Ambari&amp;#43;2.5.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://cwiki.apache.org/confluence/display/AMBARI/Installation+Guide+for+Ambari+2.5.0&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Testowy klaster obliczeniowy - VirtualBox 5 i CentOS 7</title>
            <link>https://bigdatapassion.pl/blog/testowy-klaster-obliczeniowy-virtualbox-5-i-centos-7/</link>
            <pubDate>Thu, 04 May 2017 12:59:11 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/testowy-klaster-obliczeniowy-virtualbox-5-i-centos-7/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/devops/virtualbox-logo.png&#34; alt=&#34;Featured image of post Testowy klaster obliczeniowy - VirtualBox 5 i CentOS 7&#34; /&gt;&lt;p&gt;VirtualBox jest darmowym narzędziem firmy Oracle (poprzednio Sun Microsystems) pozwaląjącym na łatwą i wygodną wirtualizację na własnym komputerze. W bardzo szybki sposób jesteśmy w stanie stworzyć z jego pomocą klaster kilku maszyn i z powodzeniem używać go do testów.&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-virtualboxa&#34;&gt;Instalacja VirtualBox&amp;rsquo;a&#xA;&lt;/h1&gt;&lt;p&gt;VirtualBox&amp;rsquo;a można zainstalować na systemie Windows, Linux, MacOS i Solaris ściągając instalator ze strony projektu &lt;a class=&#34;link&#34; href=&#34;https://www.virtualbox.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.virtualbox.org/&lt;/a&gt;. Użytkownicy systemów Linux mogą go też łatwo i szybko zainstalować za pomocą repozytoriów (zalecane dla początkujących użytkowników).&lt;/p&gt;&#xA;&lt;p&gt;Po zainstalowaniu możemy uruchomić narzędzie w trybie graficznym lub korzystać z linii komend. Ta druga opcja udostępnia większe możliwości, jednak jest adresowana do bardziej doświadczonych użytkowników, dlatego skorzystamy z wersji okienkowej.&lt;/p&gt;&#xA;&lt;p&gt;Po uruchomieniu wersji graficznej powinniśmy zobaczyć coś takiego:&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox1.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;stworzenie-maszyny-w-virtualbox&#34;&gt;Stworzenie maszyny w VirtualBox&#xA;&lt;/h1&gt;&lt;p&gt;Teraz tworzymy nową czystą maszynę klikając &lt;em&gt;New&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;W nowo otwartym oknie wpisujemy nazwę, np. &lt;em&gt;hadoop1&lt;/em&gt;, wybieramy Typ &lt;em&gt;Linux&lt;/em&gt; i wersję &lt;em&gt;Red Hat (64-bit)&lt;/em&gt; (CentOS jest oparty o dystrubucję Red Hat Enterprise Linux).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W kolejnym ekranie przydzielamy pamięć RAM do maszyny, np. 16 GB.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox3.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tworzymy nowy wirtualny dysk dla naszej maszyny wirtualnej.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox4.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wybieramy domyślny typ dysku VDI.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox5.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ustawiamy dynamiczne alokowanie powierzchni dysku (nasz wirtualny dysk będzie miał od razu widoczną całkowitą powierzchnię, ale fizycznie plik na dysku komputera hosta na którym zainstalowany jest VirtualBox będzie miał wielkość proporcjonalną do wielkości zajmowanego miejsca na wirtualnym dysku).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox6.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ustawiamy docelową wielkość dysku (z racji dynamicznej alokacji możemy ustawić więcej niż potrzebujemy, np. 100 GB) i klimay &lt;em&gt;Create&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox7.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Nasza maszyna jest już utworzona i widzimy ją na liście.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox8.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;pobranie-centosa&#34;&gt;Pobranie CentOS&amp;rsquo;a&#xA;&lt;/h1&gt;&lt;p&gt;Najnowszą siądmą wersję systemu CentOS (Community ENTerprise Operating System) można pobrać z &lt;a class=&#34;link&#34; href=&#34;https://www.centos.org/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.centos.org/download/&lt;/a&gt;. Wybieramy wersję minimal ISO, resztę pobierzemy przez sieć &lt;a class=&#34;link&#34; href=&#34;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso&lt;/a&gt;. Najszybciej będzie ściągnąć iso z serwerów ICM&amp;rsquo;u lub AGH.&lt;/p&gt;&#xA;&lt;h1 id=&#34;instalacja-centosa&#34;&gt;Instalacja CentOS&amp;rsquo;a&#xA;&lt;/h1&gt;&lt;p&gt;Uruchamiamy utworzoną maszynę wirtualną przyciskiem &lt;em&gt;Run&lt;/em&gt;. Następnie wybieramy wcześniej ściągnięty obraz ISO systemu CentOS (klikamy ikonkę katalogu obok wybieranej listy)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/centos1.png&#34;&gt;&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/centos2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po uruchomieniu maszyny z obrazu ISO wybieramy instalację.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/centos3.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Możemy ustawić język polski dla zgodności z polskimi stronami kodowymi.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/centos4.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Instalator będzie nas prosić o potwierdzenie automatycznego partycjonowania całego dysku.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/centos5.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Podczas instalacji systemu konieczne jest ustawienie hasła dla użytkownika &lt;em&gt;root&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/centos6.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Gdy system skończy się instalować uruchamiamy ponownie maszynę (Virtualbox uruchomi ją już automatycznie z dysku wirtualnego a nie z wskazanego obrazu ISO)&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/centos7.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Po uruchomieniu maszyny możemy zalogować się do niej na użytkownika &lt;em&gt;root&lt;/em&gt; wpisując go jako login i podając wcześniej ustawione hasło.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/centos8.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;konfiguracja-sieci&#34;&gt;Konfiguracja sieci&#xA;&lt;/h1&gt;&lt;p&gt;Dla wyłączonej maszyny w VirtualBox w zakładce &lt;em&gt;Sieć&lt;/em&gt; ustawiamy &lt;em&gt;Mostkowana karta sieciowa (bridge)&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Następnie konfigurujemy stałe IP jedną z dwóch metod:&#xA;&lt;a class=&#34;link&#34; href=&#34;https://bigdatapassion.pl/blog/centos-setting-static-ip&#34; &gt;Konfiguracja sieci w systemie CentOS 7&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;dodatkowe-maszyny&#34;&gt;Dodatkowe maszyny&#xA;&lt;/h1&gt;&lt;p&gt;Jeśli chcemy mieć więcej maszyn możemy ten proces powtórzyć mogąc jednocześnie wybrać inne opcje konfiguracyjne lub po prostu gdy chcemy mieć identyczne maszyny sklonować już stworzoną maszynę. W tym celu klikamy prawym przyciskiem myszy na wybranej maszynie i wybieramy opcję klonowania (Ctrl+O)&lt;/p&gt;&#xA;&lt;p&gt;Warto przy tym wybrać opcję stworzenia innego numeru MAC adresu karty sieciowej:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox9.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;oraz wybrać pełną kopię&lt;/p&gt;&#xA;&lt;p&gt;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox10.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W przypadku dodatkowego pytania o klonowanie snapshotów, możemy je pominąć i wybrać tylko aktualny stan&#xA;&lt;img loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://bigdatapassion.pl/img/virtualbox-installing-cluster-with-centos/virtualbox11.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;W ten sposób otrzymaliśmy gotowy klaster testowy i możemy zainstalować na nim Hadoopa lub całą wybraną jego dystrybucję czemu poświęcone będą kolejne wpisy.&lt;/p&gt;&#xA;&lt;h1 id=&#34;legenda&#34;&gt;Legenda&#xA;&lt;/h1&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.virtualbox.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.virtualbox.org/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.centos.org/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://www.centos.org/download/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Konfiguracja sieci w systemie CentOS / RedHat 8</title>
            <link>https://bigdatapassion.pl/blog/konfiguracja-sieci-w-systemie-centos-/-redhat-8/</link>
            <pubDate>Sun, 02 Apr 2017 21:34:44 +0200</pubDate>
            <guid>https://bigdatapassion.pl/blog/konfiguracja-sieci-w-systemie-centos-/-redhat-8/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/linux/centos-logo.png&#34; alt=&#34;Featured image of post Konfiguracja sieci w systemie CentOS / RedHat 8&#34; /&gt;&lt;p&gt;Trzy sposoby konfiguracji sieci w systemie CentOS 7.&lt;/p&gt;&#xA;&lt;h1 id=&#34;dynamiczne-ip-za-pomocą-dhcp&#34;&gt;Dynamiczne IP za pomocą DHCP&#xA;&lt;/h1&gt;&lt;p&gt;Sprawdzamy interfejsy sieciowe i urządzenia&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip l&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Łączymy się z siecią za pomocą DHCP i interfejsem enp03&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dhclient -v enp0s3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;autostart-dhcp-wraz-z-systemem-operacyjnym&#34;&gt;Autostart DHCP wraz z systemem operacyjnym&#xA;&lt;/h1&gt;&lt;p&gt;W pliku /etc/sysconfig/network-scripts/ifcfg-enp0s3 zmieniamy ONBOOT na &amp;ldquo;yes&amp;rdquo;.&#xA;W powyższym przykładzie &amp;ldquo;enp0s3&amp;rdquo; to nazwa naszego urządzenia z listy zwróconej przez &amp;ldquo;ip l&amp;rdquo;&lt;/p&gt;&#xA;&lt;h1 id=&#34;statyczne-ip-ustawiane-ręcznie&#34;&gt;Statyczne IP ustawiane ręcznie&#xA;&lt;/h1&gt;&lt;p&gt;Wyłączamy NetworkManager&amp;rsquo;a&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl disable NetworkManager.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl stop NetworkManager.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ręcznie dodajemy następujące wpisy do pliku /etc/sysconfig/network-scripts/ifcfg-enp0s3&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BOOTPROTO&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;static&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ONBOOT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;IPADDR&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;192.168.172.186&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NETMASK&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;255.255.255.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;GATEWAY&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;192.168.172.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DNS1&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;8.8.8.8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ewentualnie można zamiast edytora vi użyć sed&amp;rsquo;a:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/ONBOOT=no/ONBOOT=yes/g&amp;#39;&lt;/span&gt;  /etc/sysconfig/network-scripts/ifcfg-enp0s3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sed -i &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;s/BOOTPROTO=dhcp/BOOTPROTO=static/g&amp;#39;&lt;/span&gt;  /etc/sysconfig/network-scripts/ifcfg-enp0s3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restartujemy serwis sieciowy&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl restart network.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;statyczne-ip-ustawiane-za-pomocą-network-manageraip&#34;&gt;Statyczne IP ustawiane za pomocą Network Manageraip&#xA;&lt;/h1&gt;&lt;p&gt;Zanim zaczniemy używać narzędzia nmtui, musimy ustawić &amp;ldquo;NM_CONTROLLED=yes&amp;rdquo; w pliku /etc/sysconfig/network-scripts/ifcfg-enp0s3.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;vi /etc/sysconfig/network-scripts/ifcfg-enp0s3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edytujemy ustawienia urządzeni &lt;em&gt;enp0s3&lt;/em&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nmtui edit enp0s3 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ustawiamy statyczny adres IP&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.172.186/24&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;oraz zaznaczamy opcje:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Wymagane adresowanie IPv4 dla tego połączenia&lt;/li&gt;&#xA;&lt;li&gt;Łączenie automatyczne&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Restartujemy serwis sieciowy&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl restart network.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
        </item><item>
            <title>Witaj świecie</title>
            <link>https://bigdatapassion.pl/blog/witaj-%C5%9Bwiecie/</link>
            <pubDate>Sat, 01 Apr 2017 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/witaj-%C5%9Bwiecie/</guid>
            <description>&lt;img src=&#34;https://bigdatapassion.pl/img/featured/pic03.jpg&#34; alt=&#34;Featured image of post Witaj świecie&#34; /&gt;&lt;p&gt;Big Data Passion to strona dla pasjonatów szeroko rozumianego Big Data. Treści prezentowane na stronie będą dotyczyć takich tematów jak:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Języki programowania (Java, Scala, Kotlin, Groovy, Python, Ruby, SQL, Bash etc.)&lt;/li&gt;&#xA;&lt;li&gt;Przetwarzanie danych (Spark, MapReduce, Tez, Apex, Hive, Pig, Impala etc.)&lt;/li&gt;&#xA;&lt;li&gt;Strumieniowe przetwarzanie i składowanie danych (Kafka, ActiveMQ, Flume, NiFi, MiNiFi, Logstash, Spark Streaming, Flink, Storm etc.)&lt;/li&gt;&#xA;&lt;li&gt;Analizę danych, Data Science, NLP, Machine Learning, Sztuczną Inteligencję (Mahout, Spark MLlib, MXNet, Tensorflow etc.)&lt;/li&gt;&#xA;&lt;li&gt;NoSQL i składowanie danych (HDFS, HBase, Cassandra, Mongo, Redis, Hazelcast, Kudu, Druid etc.)&lt;/li&gt;&#xA;&lt;li&gt;Programowanie asynchroniczne (Vert.x, Netty, NodeJS etc.)&lt;/li&gt;&#xA;&lt;li&gt;Biblioteki i narzędzia (Akka, Spring framework, Spring Data, Spring Integration, Spring XD etc.)&lt;/li&gt;&#xA;&lt;li&gt;Wyszukiwanie danych (Lucene, Solr, Elasticsearch etc.)&lt;/li&gt;&#xA;&lt;li&gt;Business Intelligence (Kylin, Pentaho, Mondrian, Kettle etc.)&lt;/li&gt;&#xA;&lt;li&gt;Wizualizacja i prezentacja danych (Zeppelin, Jupyter, Kibana, Superset, Hue etc.)&lt;/li&gt;&#xA;&lt;li&gt;Dystrybucje Big Data (Hortonworks, Cloudera, MapR, BigTop etc.)&lt;/li&gt;&#xA;&lt;li&gt;Chmury obliczeniowe (Amazon Web Services, Microsoft Azure, Google Cloud Platform, Oracle Cloud, Databricks Cloud, Confluent Cloud, Oktawave etc.)&lt;/li&gt;&#xA;&lt;li&gt;Administrowanie i zarządzanie rozproszonymi klastrami obliczeniowymi, usługami i procesami (DevOps, Docker, Kubernetes, Ansible, Jenkins, Oozie, Airflow etc.)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title></title>
            <link>https://bigdatapassion.pl/blog/</link>
            <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
            <guid>https://bigdatapassion.pl/blog/</guid>
            <description>&lt;p&gt;Java wyzwania program: &lt;a class=&#34;link&#34; href=&#34;http://kodolamacz.pl/kurs-java/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;http://kodolamacz.pl/kurs-java/&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Wyzwania programistyczne (poniedziałki):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Wstęp do programowania funkcyjnego, , klasy wewnętrzne, adnotacje,&lt;/li&gt;&#xA;&lt;li&gt;Operacje matematyczne, na tekstach  i na datach (local date)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tematy dodatkowe (piątki):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;książki które należy przeczytać&lt;/li&gt;&#xA;&lt;li&gt;jak się uczyć programować, najlepsze źródła i książki&lt;/li&gt;&#xA;&lt;li&gt;Poznaj lepiej swoje IDE&lt;/li&gt;&#xA;&lt;li&gt;Kariera programisty, czyli jak to wygląda naprawdę&lt;/li&gt;&#xA;&lt;li&gt;Dobre techniki, wzorce, clean code itd itp&lt;/li&gt;&#xA;&lt;li&gt;Java effective programming&lt;/li&gt;&#xA;&lt;li&gt;Proces tworzenia oprogramowania, ci, CD, agile, itd itp&lt;/li&gt;&#xA;&lt;li&gt;Git i inne repozytoria&lt;/li&gt;&#xA;&lt;li&gt;Co dalej po wyzwaniach?&lt;/li&gt;&#xA;&lt;li&gt;kariera developera&lt;/li&gt;&#xA;&lt;li&gt;model pamięci w JVM&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;TODO:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;złożoność cyklomatyczna&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;String + char&lt;/li&gt;&#xA;&lt;li&gt;rzutowanie&lt;/li&gt;&#xA;&lt;li&gt;więcej o pętlach&amp;hellip;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tutorial Oracle:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.oracle.com/javase/tutorial/collections/implementations/index.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://docs.oracle.com/javase/tutorial/collections/implementations/index.html&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
