├── .gitignore
├── .gitmodules
├── .hugo_build.lock
├── .idea
├── .gitignore
├── everyone-can-code.iml
├── misc.xml
├── modules.xml
└── vcs.xml
├── README.md
├── archetypes
└── default.md
├── config.toml
├── content
├── blog
│ ├── 2019
│ │ ├── 08
│ │ │ ├── docker.md
│ │ │ ├── fp.md
│ │ │ └── solid.md
│ │ └── 09
│ │ │ └── spring-security.md
│ └── 2024
│ │ └── 11
│ │ └── digital-services-agency.md
├── books.md
└── presentations.md
├── data
└── comments
│ └── .gitkeep
├── deploy.sh
├── layouts
└── shortcodes
│ └── fancybox.html
└── static
├── css
└── add-on.css
├── img
├── 2019
│ ├── 08
│ │ ├── docker-php-symfony-phpstorm.png
│ │ ├── fp.jpg
│ │ └── solid.png
│ └── 09
│ │ ├── spring-security-access-decision-6.png
│ │ ├── spring-security-access-denied-7.png
│ │ ├── spring-security-access-denied-7a.png
│ │ ├── spring-security-access-denied-7b.png
│ │ ├── spring-security-access-denied-7c.png
│ │ ├── spring-security-authentication-filter-1.png
│ │ ├── spring-security-authentication-provider-3-and-user-details-service.png
│ │ ├── spring-security-authentication-token-2.png
│ │ ├── spring-security-filter-security-interceptor-5.png
│ │ ├── spring-security-security-context-4.png
│ │ └── spring-security.jpg
├── 2024
│ └── 11
│ │ └── digital-services-agency.webp
└── main
│ ├── books
│ ├── agile-software-development.jpg
│ ├── algoritmy-na-java-robert-sedzhvik-kevin-uejn.png
│ ├── atencio_hires_fc.png
│ ├── atomic-design-book.jpg
│ ├── chistaja-arhitekura.jpg
│ ├── clean-architecture.jpg
│ ├── ddd-erik-evans.png
│ ├── ddd-in-php.png
│ ├── ddd-quickly.jpg
│ ├── design-patterns-via-c.jpg
│ ├── go-web-programming.jpg
│ ├── kennedy-go-hi.png
│ ├── mostly-adequate-guide.jpg
│ ├── patterns-of-enterprise-application-architecture.jpg
│ ├── pogruzenie-v-patterni-proektirovanija.jpg
│ ├── programmirovanie-na-go.jpg
│ ├── shablon-proektirovanija-prilozenij.jpg
│ ├── spring-security-third-edition.png
│ ├── unix-linux-rukovodstvo-sistemnogo-administratora.jpg
│ └── yazik-programmirovanija-go.jpg
│ ├── logo.jpg
│ └── presentations
│ ├── nginx-boilerplate.png
│ └── the-soul-of-fp-programming.png
└── js
└── add-on.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Go template
3 | # Binaries for programs and plugins
4 | *.exe
5 | *.exe~
6 | *.dll
7 | *.so
8 | *.dylib
9 |
10 | # Test binary, build with `go test -c`
11 | *.test
12 |
13 | # Output of the go coverage tool, specifically when used with LiteIDE
14 | *.out
15 |
16 | public/**
17 | public2/**
18 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "themes/ananke"]
2 | path = themes/ananke
3 | url = https://github.com/budparr/gohugo-theme-ananke.git
4 | [submodule "future-imperfect"]
5 | path = themes/future-imperfect
6 | url = https://github.com/jpescador/hugo-future-imperfect.git
7 |
--------------------------------------------------------------------------------
/.hugo_build.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sanv92/everyone-can-code/6ed45fd0c7133e82c10c2c81d6db4327cc9235e6/.hugo_build.lock
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /workspace.xml
--------------------------------------------------------------------------------
/.idea/everyone-can-code.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Install
2 | git submodule update --init --recursive
3 |
4 | # Project build
5 | hugo
6 |
7 | # Run Hugo server
8 | hugo server -D
9 |
--------------------------------------------------------------------------------
/archetypes/default.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: "{{ replace .Name "-" " " | title }}"
3 | date: {{ .Date }}
4 | draft: true
5 | ---
6 |
7 |
--------------------------------------------------------------------------------
/config.toml:
--------------------------------------------------------------------------------
1 | themebaseURL = "/"
2 | languageCode = "en-us"
3 | title = "Everyone Can Code - coding is for ANYONE, not just for engineers"
4 |
5 | theme = "future-imperfect"
6 | preserveTaxonomyNames = true
7 | pagination.pagerSize = 3
8 | disqusShortname = "shortname"
9 | googleAnalytics = ""
10 | pluralizeListTitles = false
11 | # Set the followings to true as part of your site SEO
12 | enableRobotsTXT = true
13 | canonifyURLs = true
14 |
15 | [params]
16 | # Sets the meta tag description
17 | description = "Everyone Can Code - coding is for ANYONE, not just for engineers, if you are a highly motivated beginner and want to learn the craft of programming, then we are ready to help you with this."
18 | # Sets the navbarTitle that appears in the top left of the navigation bar
19 | navbarTitle = "Everyone Can Code"
20 | # Sets where "View More Posts" links
21 | viewMorePostLink = "/blog/"
22 |
23 | # Optional Params
24 | # Sets navbarTitle to match the section of the website
25 | dynamicTitles = true
26 | # Sets RSS icons to appear on the sidebar with the social media buttons
27 | rssAppearAtTop = true
28 | rssAppearAtBottom = true
29 | # Sets Social Media icons to appear on the sidebar
30 | socialAppearAtTop = true
31 | socialAppearAtBottom = false
32 | # Sets Categories to sort by number of posts instead of alphabetical
33 | categoriesByCount = true
34 | # set to show or to hide categories in the sidebar
35 | showSidebarCategories = true
36 | # Sets Estimated Reading Time to appear in post headers
37 | includeReadingTime = true
38 | # Sets the Favicon and Version for the site. Default support is for
39 | # apple-touch-icon-precomposed.png, favicon.png, favicon.ico, and mstile.png.
40 | # These are stored in the favicon folder. See the following for more information:
41 | # https://github.com/audreyr/favicon-cheat-sheet
42 | loadFavicon = false
43 | faviconVersion = ""
44 | # Sets Social Share links to appear on posts
45 | socialShare = true
46 | # Sets specific share to appear on posts (default behavior is to appear)
47 | socialShareTwitter = false
48 | socialShareGoogleplus = false
49 | socialShareFacebook = false
50 | socialShareReddit = false
51 | socialShareLinkedin = false
52 | socialShareStumbleupon = false
53 | socialSharePinterest = false
54 | socialShareEmail = false
55 | socialShareGithub = false
56 |
57 | # Load custom CSS or JavaScript files. The variable is an array so that you
58 | # can load multiple files if necessary. You can also load the standard theme
59 | # files by adding the value, "default".
60 | # customCSS = ["default", "/path/to/file"]
61 | # customJS = ["default", "/path/to/file"]
62 | customCSS = ["default"]
63 | customJS = ["default"]
64 |
65 | # options for highlight.js (version, additional languages, and theme)
66 | disable_highlight = false # set to true to disable Highlight
67 | highlightjsVersion = "9.11.0"
68 | highlightjsCDN = "//cdn.bootcss.com"
69 | highlightjsLang = ["r", "yaml", "css"]
70 | highlightjsTheme = "monokai"
71 | MathJaxCDN = "//cdn.bootcss.com"
72 | MathJaxVersion = "2.7.1"
73 |
74 | # Disqus will take priority over Staticman (github.com/eduardoboucas/staticman)
75 | # due to its ease of use. Feel free to check out both and decide what you would
76 | # prefer to use. See Staticman.yml for additional settings.
77 | [params.staticman]
78 | # Sets Statiman to be active
79 | staticman = false
80 | # Sets the location for Staticman to connect to
81 | username = ""
82 | repo = ""
83 | branch = ""
84 |
85 | [params.staticman.recaptcha]
86 | sitekey = "SITE_KEY"
87 | secret = "ENCRYPTED_SECRET"
88 |
89 | [params.postAmount]
90 | # Sets the number of recent posts to show in the sidebar. The default value is 5.
91 | sidebar = 5
92 |
93 | [[menu.main]]
94 | name = "Home"
95 | url = "/"
96 | identifier = "fa fa-home"
97 | weight = 1
98 |
99 | [[menu.main]]
100 | name = "Categories"
101 | url = "/categories/"
102 | identifier = "fa fa-sitemap"
103 | weight = 3
104 |
105 | [[menu.main]]
106 | name = "Books"
107 | url = "/books/"
108 | identifier = "fa fa-book"
109 | weight = 4
110 |
111 | [[menu.main]]
112 | name = "Presentations"
113 | url = "/presentations/"
114 | identifier = "fa fa-newspaper-o"
115 | weight = 5
116 |
117 | # Sets Social Media icons to appear and link to your account. Value should be your
118 | # username unless otherwise noted. These are the icons affected by socialAppearAtTop
119 | # and socialAppearAtBottom.
120 | [social]
121 | # Coding Communities
122 | github = "SanderV1992"
123 |
124 | # Email
125 | email = "doctypestudio@gmail.com"
126 |
--------------------------------------------------------------------------------
/content/blog/2019/08/docker.md:
--------------------------------------------------------------------------------
1 | +++
2 | author = "Sander"
3 | categories = ["docker", "php", "symfony", "phpunit"]
4 | tags = ["docker + symfony", "docker + phpstorm", "docker + xdebug", "docker + phpunit"]
5 | date = "2019-08-28"
6 | description = "Symfony 4.2 skeleton with fully configured Docker, PHPSTORM, Xdebug, PHPUnit"
7 | featured = "docker-php-symfony-phpstorm.png"
8 | featuredalt = "Symfony with Docker"
9 | featuredpath = "date"
10 | linktitle = ""
11 | title = "Symfony 4.2 skeleton with fully configured Docker, PHPSTORM, Xdebug, PHPUnit"
12 | type = "post"
13 |
14 | +++
15 |
16 | ### Follow this link for more information:
17 | https://everyone-can-code.github.io/Symfony-setting-up-PhpStorm-with-Xdebug-and-Docker-configuration/
18 |
--------------------------------------------------------------------------------
/content/blog/2019/08/fp.md:
--------------------------------------------------------------------------------
1 | +++
2 | author = "Sander"
3 | categories = ["functional programming"]
4 | tags = ["tutorial"]
5 | date = "2019-08-28"
6 | description = "Functional Programming (Specification Guide)"
7 | featured = "fp.jpg"
8 | featuredalt = "Functional Programming (Specification Guide)"
9 | featuredpath = "date"
10 | linktitle = ""
11 | title = "Functional Programming (Specification Guide)"
12 | type = "post"
13 |
14 | +++
15 |
16 | ### Follow this link for more information:
17 | https://everyone-can-code.github.io/fp/
18 |
--------------------------------------------------------------------------------
/content/blog/2019/08/solid.md:
--------------------------------------------------------------------------------
1 | +++
2 | author = "Sander"
3 | categories = ["principles, patterns, practices"]
4 | tags = ["solid", "principles"]
5 | date = "2019-08-28"
6 | description = "Solid principles"
7 | featured = "solid.png"
8 | featuredalt = "solid principles"
9 | featuredpath = "date"
10 | linktitle = ""
11 | title = "Solid principles"
12 | type = "post"
13 |
14 | +++
15 |
16 | ### Follow this link for more information:
17 | https://everyone-can-code.github.io/solid/
18 |
19 | ### Solid examples:
20 | https://github.com/SanderV1992/SOLID-examples
21 |
--------------------------------------------------------------------------------
/content/blog/2019/09/spring-security.md:
--------------------------------------------------------------------------------
1 | +++
2 | author = "Sander"
3 | categories = ["spring framework"]
4 | tags = ["spring", "spring security", "framework"]
5 | date = "2019-09-07"
6 | description = "Short introduction to Spring Security Architecture"
7 | featured = "spring-security.jpg"
8 | featuredalt = "Short introduction to Spring Security Architecture"
9 | featuredpath = "date"
10 | linktitle = ""
11 | title = "Short introduction to Spring Security Architecture"
12 | type = "post"
13 |
14 | +++
15 |
16 | ## Short introduction, how spring works step by step
17 |
18 | ### 1. Authentication Filter
19 | {{< fancybox "date" "spring-security-authentication-filter-1.png" "A Spring Security Authentication Filter" "gallery" >}}
20 |
21 | - Http Servlet Request
22 | - Authentication Filter (Extract Username and Password from Header)
23 | - Create Username and Password `"Authentication Token"` `"UsernamePasswordAuthenticationToken"`
24 | - Pass `"Authentication Token"` to `"Authentication Manager"`
25 |
26 | ### 2. Authentication
27 | {{< fancybox "date" "spring-security-authentication-token-2.png" "A Spring Security Authentication Filter" "gallery" >}}
28 | After the system is successfully Authenticated the identity,
29 | it will return new `"Authenticated Token"` with:
30 |
31 | - Principal: UserDetails
32 | - Credentials: (we no longer need to keep the password in our memory because it is not safe)
33 | - Authorities: ROLE_USER
34 | - Authenticated: true
35 |
36 | Example: AbstractUserDetailsAuthenticationProvider
37 | {{< highlight java >}}
38 | protected Authentication createSuccessAuthentication(Object principal,
39 | Authentication authentication, UserDetails user) {
40 | UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(
41 | principal, authentication.getCredentials(),
42 | authoritiesMapper.mapAuthorities(user.getAuthorities()));
43 | result.setDetails(authentication.getDetails());
44 |
45 | return result;
46 | }
47 | {{< /highlight >}}
48 |
49 | UsernamePasswordAuthenticationToken
50 | {{< highlight java >}}
51 | public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
52 | Collection extends GrantedAuthority> authorities) {
53 | super(authorities);
54 | this.principal = principal;
55 | this.credentials = credentials;
56 | super.setAuthenticated(true);
57 | }
58 | {{< /highlight >}}
59 |
60 | ### 3. AuthenticationProvider and UserDetails/Service
61 | {{< fancybox "date" "spring-security-authentication-provider-3-and-user-details-service.png" "A Spring Security Authentication Filter" "gallery" >}}
62 |
63 | `"Authentication Manager"` delegate `"Authenticated Token"` to `"Authentication Provider"`
64 |
65 | #### More detailed:
66 | ProviderManager is default implementation of interface Authentication Manager,
67 | when we delegate providers to ProviderManager, it will check all providers, are they are supported or not,
68 | it will only use those providers that are supported.
69 |
70 | P.S: `"Authentication Manager"` is interface and `"ProviderManager"` is default implementation of this interface.
71 |
72 | ### 4. Security Context - it is holder for context information, related to security.
73 | {{< fancybox "date" "spring-security-security-context-4.png" "A Spring Security Authentication Filter" "gallery" >}}
74 |
75 | To access protected endpoints, you need to store `"Authentication Token"` that will be easily accessible,
76 | that's where the `"ThreadLocal"` comes in, but we don't use it directly,
77 | we use a higher level wrapper, `"Security Context"`.
78 |
79 | To save `"Authentication Token"` some where, we use `"Security Context"` which allow us to stores a list of rules `"SecurityContext"` use `ThreadLocal` inside implementation.
80 |
81 | `"ThreadLocal"` - allows us to store data that will be accessible only by a specific thread,
82 | each thread holds it's own copy of data, as long as thread is alive.
83 |
84 | ### Authentication Recap
85 | - "Authentication Filter" - creates and "Authentication Token" and passes it to the "Authentication Manager".
86 | - "Authentication Manager" - delegates to the "Authentication Provider".
87 | - "Authentication Provider" - uses a "UserDetailsService" to load the "UserDetails" and returns an "Authenticated Principal",
88 | back to the "Authentication Manager".
89 | - "Authentication Manager" - pass back to "Authentication Filter".
90 | - "Authentication Filter" - sets the "Authentication Token" to the "SecurityContext".
91 |
92 | ### 5. Filter Security Interceptor - last filter in security filter chain, that protect access to protected resource
93 | {{< fancybox "date" "spring-security-filter-security-interceptor-5.png" "A Spring Security Authentication Filter" "gallery" >}}
94 | At the last stage, the authorization is based on the url of the request.
95 | FilterSecurityInterceptor is inherited from AbstractSecurityInterceptor and decides, does current user has access to the current url.
96 |
97 | ### Authorization Recap
98 | - FilterSecurityInterceptor obtains the "Security Metadata" by matching on the current request
99 | - FilterSecurityInterceptor gets the current "Authentication"
100 | - The "Authentication", "Security Metadata" and Request is passed to the "AccessDecisionManager"
101 | - The "AccessDecisionManager" delegates to it's "AccessDecisionVoter(s)" for decision.
102 |
103 | ### 6. Access Decision
104 | {{< fancybox "date" "spring-security-access-decision-6.png" "A Spring Security Authentication Filter" "gallery" >}}
105 |
106 | ### 7. Access Denied
107 | {{< fancybox "date" "spring-security-access-denied-7.png" "A Spring Security Authentication Filter" "gallery" >}}
108 | {{< fancybox "date" "spring-security-access-denied-7a.png" "A Spring Security Authentication Filter" "gallery" >}}
109 | {{< fancybox "date" "spring-security-access-denied-7b.png" "A Spring Security Authentication Filter" "gallery" >}}
110 | {{< fancybox "date" "spring-security-access-denied-7c.png" "A Spring Security Authentication Filter" "gallery" >}}
111 |
112 | ### Exception Handling Recap
113 | - When "Access Denied" for current Authentication, the
114 | ExceptionTranslationFilter delegates to the
115 | AccessDeniedHandler, which by default, returns a 403
116 | Status.
117 |
118 | - When current Authentication is "Anonymous", the
119 | ExceptionTranslationFilter delegates to the
120 | AuthenticationEntryPoint to start the Authentication
121 | process.
122 |
123 | ---
124 |
125 | #### Books:
126 | - https://drive.google.com/open?id=14O1lUgbu1spklLraPUBTQTX0fZN72670
127 |
128 | #### More detailed articles:
129 | - https://habr.com/ru/post/346628/
130 | - https://spring.io/guides/topicals/spring-security-architecture/
131 | - https://www.baeldung.com/java-threadlocal
132 | - https://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html
133 | - https://drive.google.com/file/d/1uiOKOxSI33AxW4EXpzXwbj0z77zJk0Ev/view
134 | - https://docs.spring.io/spring-security/site/docs/5.2.x/reference/htmlsingle/#filter-ordering
135 | - https://gist.github.com/zmts/802dc9c3510d79fd40f9dc38a12bccfc
136 |
137 | #### Other articles:
138 | - http://it-uroki.ru/uroki/bezopasnost/identifikaciya-autentifikaciya-avtorizaciya.html
139 | - https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/
140 |
141 | #### More detailed videos:
142 | - https://www.youtube.com/watch?v=8rnOsF3RVQc
143 | - https://www.youtube.com/watch?v=dAUTSfdGyLU
144 |
--------------------------------------------------------------------------------
/content/blog/2024/11/digital-services-agency.md:
--------------------------------------------------------------------------------
1 | +++
2 | author = "Sander"
3 | categories = ["docker", "php", "symfony", "phpunit"]
4 | tags = ["docker + symfony", "docker + phpstorm", "docker + xdebug", "docker + phpunit"]
5 | date = "2019-08-28"
6 | description = "Symfony 4.2 skeleton with fully configured Docker, PHPSTORM, Xdebug, PHPUnit"
7 | featured = "docker-php-symfony-phpstorm.png"
8 | featuredalt = "Symfony with Docker"
9 | featuredpath = "date"
10 | linktitle = ""
11 | title = "Symfony 4.2 skeleton with fully configured Docker, PHPSTORM, Xdebug, PHPUnit"
12 | type = "post"
13 |
14 | +++
15 |
16 | ### Follow this link for more information:
17 |
18 |
--------------------------------------------------------------------------------
/content/books.md:
--------------------------------------------------------------------------------
1 | +++
2 | author = "Sander"
3 | date = "2019-07-01"
4 | description = "The Best Books For Software Developers"
5 | featuredpath = "date"
6 | title = "The Best Books For Software Developers"
7 |
8 | +++
9 |
10 | ### Software Design and Architecture
11 |
12 | ##### Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series)
13 |
14 | https://drive.google.com/open?id=1BH_hFyeRmmXfLstsjWCYVTF_K9bd5OSZ
15 |
16 | ##### Чистая архитектура. Искусство разработки программного обеспечения (Роберт Мартин)
17 |
54 | https://drive.google.com/open?id=1eJ314isAej-EVDZIKWVHmQIPnX6pnSiE
55 |
56 | ---
57 |
58 | ### Spring
59 |
60 | ##### Spring Security Third Edition (Mick Knutson, Robert Winch, Peter Mularien)
61 |
62 | https://drive.google.com/open?id=14O1lUgbu1spklLraPUBTQTX0fZN72670
63 |
64 | ---
65 |
66 | ### GO
67 |
68 | ##### Язык программирования GO (Алан А. А. Донован, Брайан У. Керниган)
69 |
70 | https://drive.google.com/open?id=0B1YmWQl01wtoVnpXUkNSNGRKSDg
71 |
72 | ##### GO Web Programming (Sau Sheong Chang)
73 |
74 | https://drive.google.com/open?id=0B1YmWQl01wtoT3JtUWRSRmxUUGM
75 |
76 | ##### GO in Action (William Kennedy)
77 |
78 | https://drive.google.com/open?id=0B1YmWQl01wtoUUdLSk9HeVFBOFU
79 |
80 | ##### Программирование на языке GO (Марк Саммерфильд)
81 |
82 | https://drive.google.com/open?id=0B1YmWQl01wtoMDBaX043YlF4Mk0
83 |
84 | ---
85 |
86 | ### Linux
87 |
88 | ##### UNIX и Linux руководство системного администратора (Немет Э., Снайдер Г., Хейн Т., Уэйли Б.)
89 |