extend _components/base.pug

block pagetitle
    | Resources  

block css
    link(rel="stylesheet", href="../css/communnity.css?ver=" + config.version)
    link(rel="stylesheet", href="../css/resources.css?ver=" + config.version)

block main
    - global.pageHref = "resources.html"
    - config.hdrClassName = "hdr__grey hdr__white"
    include ./_components/header.pug


    //Миксин для блока с видео
    mixin resvideo(url, title, textclass="", thumbname="/img/resourses/video.png", sub="Webinar <br>recording", )
        article.comvideo
            .comvideo__box
                a.comvideo__screen(href=url, data-youtube)
                    span(class="comvideo__txt comvideo__txt--medium" + textclass) !{title}
                    span(class="comvideo__sub " + blacktitile) !{sub}
                    img(src=thumbname, alt="")
            .comvideo__descr.pt-2
                block


    section.reshero
        .container
            img.reshero__img(src="/img/resourses/hero.svg", alt="")
            h1.reshero__h1.h1 Apache Ignite <br>Resources
            .reshero__descr.h5.pt-3.
                Elevate your Ignite experience with the help of&nbsp;community-curated technical resources, code samples, how-to videos, training courses and&nbsp;other materials
    // /.reshero



    section.restechnical.container 
        p.capstext TECHNICAL RESOURCES
        .restechnical__grid 
            article.restechnical__item
                .restechnical__title.flexi.pb-5
                    img(src="/img/resourses/res2-book.svg", alt="")
                    span.h4 Apache Ignite Documentation
                .restechnical__box.cardsimple
                    .restechnical__subtitle.h5 Start with the technical documentation to find out:
                    .restechnical__text.pt-2
                        ul.dashlist 
                            li What are the key Apache Ignite capabilities
                            li How to use certain features
                            li How to approach cluster optimizations
                            li Best troubleshooting techniques
                    .restechnical__action 
                        a.button(href="https://ignite.apache.org/docs/latest/index", target="_blank") Discover the entire documentation
            // /.restechnical__item-1

            article.restechnical__item
                .restechnical__title.flexi.pb-5
                    img(src="/img/resourses/res2-book2.svg", alt="")
                    span.h4 Ignite Wiki
                .restechnical__box.cardsimple
                    .restechnical__subtitle.h5 A collection of low-level design documents and instructions:
                    .restechnical__text.pt-2
                        ul.dashlist 
                            li Architectural internals of Ignite components
                            li Ignite Enhancement Proposals: next big things for Ignite
                            li Coding and release guidelines
                    .restechnical__action 
                        a.button(href="https://cwiki.apache.org/confluence/display/IGNITE/", target="_blank") Check out Wiki
            // /.restechnical__item-2

            article.restechnical__item
                .restechnical__title.flexi.pb-5
                    img(src="/img/icon-github.svg", alt="")
                    span.h4 Git Repositories
                .restechnical__box.cardsimple
                    .restechnical__subtitle.h5 Ignite Source Code
                    .restechnical__text.pt-2
                        p.pb-3 Download Apache Ignite and install in your environment.
                        p Select one of the following links:
                    .restechnical__action.flexi
                        a.button(href="https://gitbox.apache.org/repos/asf?p=ignite.git", target="_blank") Ignite Git
                        a.button(href="https://github.com/apache/ignite", target="_blank") GitHub Mirror
            // /.restechnical__item-3

            article.restechnical__item
                .restechnical__title.restechnical__title--empty.flexi.pb-5
                    span.h4 &nbsp;
                .restechnical__box.cardsimple
                    .restechnical__subtitle.h5 Code samples and examples
                    .restechnical__text.pt-2
                        p Get access to examples that illustrate various Ignite functionality.
                    .restechnical__action 
                        a.button(href="https://github.com/apache/ignite/tree/master/examples", target="_blank") Examples Git
            // /.restechnical__item-4
    // /.restechnical



    
    section.resvideos
        .container 
            p.capstext LEARNING RESOURCES
            h2.h4.resicontitle.flexi
                img(src="/img/resourses/block-video.svg", alt="")
                span Essential Videos and Webinar Recordings
            p.h5.pt-1x Explore our collection of videos featuring widespread use-cases.
            .resvideos__grid.pt-5
                +resvideo('https://www.youtube.com/watch?v=UeQKuAQaMNU', "In-Memory Computing Essentials")
                    p In&nbsp;this video, we&nbsp;introduce the fundamental capabilities of&nbsp;in-memory computing platforms, such as&nbsp;high-speed performance and scalability.
                +resvideo('https://www.youtube.com/watch?v=hrnrsIkCnI0', "Distributed Computing <br>With Apache Ignite")
                    p In&nbsp;this video, we&nbsp;show how to&nbsp;design and execute distributed computations considering all the pros and cons.
                +resvideo('https://www.youtube.com/watch?v=TCsl-W0tsEE', "Consistency And Transactions <Br>Of Apache Ignite")
                    p In&nbsp;this webinar, we&nbsp;provide a&nbsp;deep understanding of&nbsp;Apache Ignite&rsquo;s support for ACID transactions and data consistency.

                +resvideo('https://www.youtube.com/watch?v=eYV-tNLzIts', "Apache Ignite <br>SQL Essentials")
                    p Learn how to&nbsp;apply a&nbsp;classic SQL database experience while enabling in-memory speeds at&nbsp;petabyte scale for a&nbsp;variety of&nbsp;workloads.
                +resvideo('https://www.youtube.com/watch?v=38YgdAOs038', "Deploying Apache Ignite In&nbsp;Kubernetes")
                    p In&nbsp;this webinar, speakers provide steps on&nbsp;how to&nbsp;deploy Ignite in&nbsp;Kubernetes.
                +resvideo('https://www.youtube.com/watch?v=eGlmZoBSS8g', "Machine Learning<br>With Apache Ignite")
                    p Watch this webinar to&nbsp;learn how to&nbsp;leverage the Apache Ignite machine learning framework to&nbsp;implement a&nbsp;continuous machine learning platform.
            .resvideos__youtube.h5.
                Explore <a href="https://www.youtube.com/channel/UChYD3lCEnzHlWioUb2sNgSg" target="_blank">the full collection of Apache Ignite videos</a> and recordings on YouTube.
    // /.resvideos



    section.rescourses.container
        h2.h4.resicontitle.flexi
            img(src="/img/resourses/icon-training.svg", alt="")
            span Trainings and Courses
        p.pt-2.h5 Enhance your knowledge in building high-performance and <br>data-intensive applications with the Apache Ignite capabilities.
        .rescourses__wrap.pt-5
            article.rescourse.cardsimple
                h3.fz20.rescourse__title.pb-2.maxline3 Apache Ignite Management <br>And Monitoring Guide
                img.rescourse__pic(src="/img/resourses/training1.svg", alt="")
                p.rescourse__descr.pb-3.pt-2 Learn how to monitor nd manage Apache Ignite clusters in production
                a.rescourse__button.button(href="https://www.gridgain.com/docs/tutorials/management-monitoring/overview", target="_blank") Training Schedule
            article.rescourse.cardsimple
                h3.fz20.rescourse__title.pb-2.maxline3.
                    Apache Ignite Essentials: Key Design Principles For Building Data-Intensive Applications
                img.rescourse__pic(src="/img/resourses/training2.svg", alt="")
                p.rescourse__descr.pb-3.pt-2 Learn about data partitioning, affinity co-location, and co-located processing
                a.rescourse__button.button(href="https://www.gridgain.com/products/services/training/apache-ignite-essentials", target="_blank") Training Schedule
            article.rescourse.cardsimple
                h3.fz20.rescourse__title.pb-2.maxline3 Apache Ignite For Spring Boot And&nbsp;Spring Data Development
                img.rescourse__pic(src="/img/resourses/training3.svg", alt="")
                p.rescourse__descr.pb-3.pt-2 Explore the best practices and nuances of&nbsp;using Spring Boot and Spring Data with Apache Ignite
                a.rescourse__button.button(href="https://www.gridgain.com/docs/tutorials/spring/spring-ignite-tutorial", target="_blank") Training Schedule
    // /.rescourses



    section.resbook.container
        h2.h4.resicontitle.flexi
            img(src="/img/resourses/block-book.svg", alt="")
            span Apache Ignite Book
        p.pt-2.h5 This book is useful for developers and architects who want to expand <br>their knowledge in in-memory computing and distributed databases.
        .resbook__wrap.pt-5.flexi 
            .resbook__picwrap
                img(src="/img/resourses/book-cover.jpg", alt="")
            .resbook__content
                .resbook__caps.capstext.pb-5 The book is recommended by <br>the Apache Ignite Community
                blockquote.resbook__quote.h5.
                    This is&nbsp;one of&nbsp;the very few good books on&nbsp;Apache Ignite. It&nbsp;covers <br>the whole spectrum of&nbsp;Ignite. From use-cases and architecture to&nbsp;maintenance and code examples that get your hands dirty. If&nbsp;you want one book to&nbsp;get it&nbsp;all, this is&nbsp;it!
                .cmtyhistory__avaavtor.pt-3.flexi
                    .cmtyhistory__avaright.cmtyhistory__avaright--noimg 
                        .cmtyhistory__avaname Edward Kuenen
                        .cmtyhistory__avaproff Software developer
                a.button.resbook__button(href="https://www.shamimbhuiyan.com/ignitebook", target="_blank") Visit the book web-site
    // /.resbook



    section.rescontacts.container
        h2.h4.resicontitle.flexi
            img(src="/img/resourses/block-email.svg", alt="")
            span Mailing Lists, Forums and Discussion Archives
        .rescontacts__wrap
            article.faqblock.flexi
                h3.faqblock__title.faqblock__title--simple.h5
                    span For general questions about Ignite
                .faqblock__right
                    h4 By e-mail
                    p For general questions about Ignite <a href="mailto:user@ignite.apache.org">user@ignite.apache.org</a>
                    .faqblock__buttons.flexi.pb-5.pt-2
                        a.faqblock__button.flexi(href="mailto:user-subscribe@ignite.apache.org?subject=Subscribe&body=Please%20subscribe%20me.") 
                            img(src="/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:user-unsubscribe@ignite.apache.org?subject=Unsubscribe&body=Please%20unsubscribe%20me.") 
                            img(src="/img/icon-email-.svg", alt="").faqblock__eicon
                            span Unsubscribe
                        a.faqblock__button.flexi(href="https://lists.apache.org/list.html?user@ignite.apache.org" target="_blank") 
                            img(src="/img/icon-folder.svg", alt="")
                            span Archives
                    h4 On StackOverflow
                    p Or&nbsp;ask a&nbsp;question on&nbsp;StackOverflow tagging the question with &laquo;ignite&raquo; or&nbsp;&laquo;apacheignite&raquo;
                    .faqblock__buttons.flexi.pt-2
                        a.faqblock__button.flexi(href="http://stackoverflow.com/questions/tagged/ignite" target="_blank") 
                            img(src="/img/icon-stackoverflow.svg", alt="").faqblock__stackicon
                            span Ask question on StackOverflow
            // /.faqblock

            article.faqblock.flexi
                h3.faqblock__title.faqblock__title--simple.h5
                    span For contribution-related discussions
                .faqblock__right
                    h4 By e-mail
                    p <a href="mailto:dev@ignite.apache.org">dev@ignite.apache.org</a>
                    .faqblock__buttons.flexi.pb-4.pt-2
                        a.faqblock__button.flexi(href="mailto:dev-subscribe@ignite.apache.org?subject=Subscribe&body=Please%20subscribe%20me.") 
                            img(src="/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:dev-unsubscribe@ignite.apache.org?subject=Unsubscribe&body=Please%20unsubscribe%20me.") 
                            img(src="/img/icon-email-.svg", alt="").faqblock__eicon
                            span Unsubscribe
                        a.faqblock__button.flexi(href="https://lists.apache.org/list.html?dev@ignite.apache.org" target="_blank") 
                            img(src="/img/icon-folder.svg", alt="")
                            span Archives
            // /.faqblock

            article.faqblock.flexi
                h3.faqblock__title.faqblock__title--simple.h5
                    span Report about bugs, possible <br>improvements and ctr.
                .faqblock__right
                    h4 By e-mail
                    p <a href="mailto:issues@ignite.apache.org">issues@ignite.apache.org</a>
                    .faqblock__buttons.flexi.pb-5.pt-2
                        a.faqblock__button.flexi(href="mailto:issues-subscribe@ignite.apache.org?subject=Subscribe&body=Please%20subscribe%20me.") 
                            img(src="/img/icon-email+.svg", alt="").faqblock__eicon
                            span Subscribe
                        a.faqblock__button.flexi(href="mailto:issues-unsubscribe@ignite.apache.org?subject=Unsubscribe&body=Please%20unsubscribe%20me.") 
                            img(src="/img/icon-email-.svg", alt="").faqblock__eicon
                            span Unsubscribe
                        a.faqblock__button.flexi(href="https://lists.apache.org/list.html?issues@ignite.apache.org" target="_blank") 
                            img(src="/img/icon-folder.svg", alt="")
                            span Archives
            // /.faqblock