Skip to content

Commit

Permalink
Refactor i afegir sobre-mi
Browse files Browse the repository at this point in the history
  • Loading branch information
rubenrubiob committed May 4, 2023
1 parent 281c36a commit ce84a67
Show file tree
Hide file tree
Showing 17 changed files with 90 additions and 41 deletions.
4 changes: 2 additions & 2 deletions _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ description: Rubén Rubio
# Includes an icon in the footer for each username you enter
footer-links:
dribbble:
email:
email: [email protected]
facebook:
flickr:
github: rubenrubiob
instagram:
linkedin:
linkedin: rubenrubiob
pinterest:
rss: rss
twitter: rubenrubiob
Expand Down
4 changes: 1 addition & 3 deletions _includes/menu.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
<a href="{{ site.baseurl }}/">Inici</a>
<a href="{{ site.baseurl }}/dev/">Dev</a>
<a href="{{ site.baseurl }}/filosofia/">Filosofia</a>
<a href="{{ site.baseurl }}/divan-del-tamarit/">Diván del Tamarit</a>
<a href="{{ site.baseurl }}/cercar/">Cercar</a>
<a href="{{ site.baseurl }}/sobre-mi/">Sobre mi</a>
5 changes: 4 additions & 1 deletion _layouts/default.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
<link rel="canonical" href="{{ site.url }}{{ page.url }}" />

<meta name="theme-color" content="#000000">
<link rel="apple-touch-icon" sizes="180x180" href="{{ site.baseurl }}/images/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="{{ site.baseurl }}/images/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="{{ site.baseurl }}/images/favicon-16x16.png">
<link rel="manifest" href="{{ site.baseurl }}/images/site.webmanifest">
</head>

<body>
Expand All @@ -21,7 +24,7 @@
<header class="masthead clearfix">
<div class="site-info">
<h1 class="site-name"><a href="{{ site.baseurl }}/">{{ site.name }}</a></h1>
<div class="site-description">Sènior PHP Backend i graduat en filosofia</div>
<div class="site-description">Consultor PHP Backend</div>
</div>

<nav>
Expand Down
5 changes: 3 additions & 2 deletions _layouts/dev-list.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@ <h1>{{ page.title }}</h1>
{% assign dev_pages=site.pages | where_exp: "item", "item.url contains '/dev/'" | sort: 'date' | reverse %}
{% for content_page in dev_pages %}
{% if content_page.url != '/dev/' %}
<p>
<div>
<p class="post_list_date">{{content_page.date}}</p>
<a href="{{ site.baseurl }}{{ content_page.url }}">
{{ content_page.title }}
</a>
</p>
</div>
{% endif %}
{% endfor %}
</div>
Expand Down
19 changes: 4 additions & 15 deletions _layouts/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,20 @@ <h2>Darrers articles</h2>
<div class="home-content-list">
{% assign dev_pages=site.pages | where_exp: "item", "item.url contains '/dev/'" | sort: 'date' | reverse %}
<div class="column">
<h3>Dev</h3>
<ul>
<ul class="post_list">
{% for dev_page in dev_pages limit:5 %}
{% if dev_page.url != '/dev/' %}
<li>
<p class="post_list_date">{{dev_page.date}}</p>
<a href="{{ site.baseurl }}{{ dev_page.url }}">
{{ dev_page.title }}
</a>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
<div class="column">
<h3>Filosofia</h3>
<ul>
{% assign filosofia_pages=site.pages | where_exp: "item", "item.url contains '/filosofia/filoara/'" | sort: 'date' | reverse %}
{% for content_page in filosofia_pages limit:5 %}
<li>
<a href="{{ site.baseurl }}{{ content_page.url }}">
{{ content_page.title }}
</a>
</li>
{% endfor %}
</ul>
<p class="home_view_all"><a href="{{ site.baseurl }}/dev/">Veure tot</a></p>

</div>
</div>

Expand Down
14 changes: 14 additions & 0 deletions assets/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,10 @@ ul ul, ol ul {
list-style-type: circle;
}

ul.post_list {
list-style-type: none;
}

em, i {
font-style: italic;
}
Expand Down Expand Up @@ -272,6 +276,16 @@ p > img {
color: $gray;
}

.post_list_date {
display: inline;
font-style: italic;
color: $gray;
}

p.home_view_all {
text-align: center;
}

// Specify the color of the selection
::-moz-selection {
color: $black;
Expand Down
16 changes: 8 additions & 8 deletions dev/2023-04-controladors-nets-a-symfony-iii-gestio-peticions.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,12 @@ final readonly class CreateLlibreController
Veiem que al controlador hem de validar el JSON que ens ve a la petició: que vinguin tots els camps, que tinguin el
format correcte...

A Symfony existeix el [component Form](https://symfony.com/doc/current/forms.html), que permet validar les dades que
A Symfony existeix el [component Form](https://symfony.com/doc/current/forms.html){:target="_blank"}, que permet validar les dades que
vinguin a una petició. Ara bé, el component Form té sentit per a aplicacions tradicionals, en què PHP renderitza el
_backend_ i el _frontend_ d'una aplicació, no tant per a una API. A més a més, és complex de configurar en aquest cas
d'ús.

Ara bé, internament, el component Form empra el [component Validator](https://symfony.com/doc/current/validation.html)
Ara bé, internament, el component Form empra el [component Validator](https://symfony.com/doc/current/validation.html){:target="_blank"}
per a validar els camps. Aquest és el component que conté tota la potència de validació del component Form.

Per a simplificar el nostre controlador, aprofitarem el component Validator fent servir els esdeveniments del `Kernel`
Expand All @@ -129,10 +129,10 @@ Tal com vam explicar, el `Kernel` de Symfony fa servir esdeveniments en què el
![Font: documentació de Symfony](/images/dev/symfony-kernel-events.png)

Veiem que hi ha un punt que s'executa immediatament abans del controlador, el 4,
que [resol els seus arguments](https://symfony.com/doc/current/components/http_kernel.html#4-getting-the-controller-arguments).
que [resol els seus arguments](https://symfony.com/doc/current/components/http_kernel.html#4-getting-the-controller-arguments){:target="_blank"}.
El que fa el `Kernel` de Symfony és executar un controlador, que és un `callable`, passant-li un `array` d'arguments.
Per a cadascun d'aquests arguments, Symfony en calcula el valor emprant serveis que implementen la
interfície [`ValueResolverInterface`](https://github.com/symfony/symfony/blob/6.2/src/Symfony/Component/HttpKernel/Controller/ValueResolverInterface.php)[^1].
interfície [`ValueResolverInterface`](https://github.com/symfony/symfony/blob/6.2/src/Symfony/Component/HttpKernel/Controller/ValueResolverInterface.php){:target="_blank"}[^1].

Per exemple, Symfony incorpora una implementació de `ValueResolver` que mira si un dels arguments del controlador
és de tipus `Request`; si ho és, n'injecta la petició actual.
Expand Down Expand Up @@ -195,9 +195,9 @@ Cal notar que tots els atributs són públics, ja que aquesta classe és un DTO.
Amb tot això, ja podem implementar el nostre `ValueResolverInterface`, que transformarà una petició en un
objecte de tipus `APIRequestBody`.

Fem servir la llibreria [cuyz/valinor](https://valinor.cuyz.io/latest/) que
ja [vam configurar al `Kernel`](/dev/2022-12-valinor-a-symfony-amb-value-objects/). També cal instal·lar
el [component Validator de Symfony](https://symfony.com/doc/current/validation.html).
Fem servir la llibreria [cuyz/valinor](https://valinor.cuyz.io/latest/){:target="_blank"} que
ja [vam configurar al `Kernel`](/dev/2022-12-valinor-a-symfony-amb-value-objects/){:target="_blank"}. També cal instal·lar
el [component Validator de Symfony](https://symfony.com/doc/current/validation.html){:target="_blank"}.

La implementació és la següent:

Expand Down Expand Up @@ -355,4 +355,4 @@ algun error de domini durant l'execució del `Command`.

[^1]: A Symfony 5.4 cal implementar la interfície `ArgumentValueResolverInterface`.

[^2]: A Symfony 6.3 han afegit una funcionalitat similar: [Mapping Request Data to Typed Objects](https://symfony.com/blog/new-in-symfony-6-3-mapping-request-data-to-typed-objects)
[^2]: A Symfony 6.3 han afegit una funcionalitat similar: [Mapping Request Data to Typed Objects](https://symfony.com/blog/new-in-symfony-6-3-mapping-request-data-to-typed-objects){:target="_blank"}
14 changes: 7 additions & 7 deletions dev/2023-05-complir-regles-arquitectura-amb-deptrac.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ revisem a fons el codi.
Afortunadament, PHP té un ecosistema molt ric i existeixen utilitats per a verificar les regles de la nostra
arquitectura:

- [Deptrac](https://github.com/qossmic/deptrac)
- [PHP Architecture Tester](https://github.com/carlosas/phpat) (com a _plugin_ de PHPStan)
- [PHPArkitect](https://github.com/phparkitect/arkitect)
- [Deptrac](https://github.com/qossmic/deptrac){:target="_blank"}
- [PHP Architecture Tester](https://github.com/carlosas/phpat){:target="_blank"} (com a _plugin_ de PHPStan)
- [PHPArkitect](https://github.com/phparkitect/arkitect){:target="_blank"}

En aquest post veurem com configurar Deptrac per a fer complir les regles de l'arquitectura hexagonal que hem descrit
més a dalt.
Expand All @@ -56,10 +56,10 @@ dependències a la integració contínua del nostre projecte.

### Conceptes

Els [conceptes principals de Deptrac](https://qossmic.github.io/deptrac/concepts/) són els següents:
Els [conceptes principals de Deptrac](https://qossmic.github.io/deptrac/concepts/){:target="_blank"} són els següents:

- Capes (_layers_): són agrupacions de _tokens_ (classes, funcions...). Per exemple, totes les classes que formen part de
la nostra capa de domini. Deptrac ofereix múltiples [col·lectors](https://qossmic.github.io/deptrac/collectors/) per a
la nostra capa de domini. Deptrac ofereix múltiples [col·lectors](https://qossmic.github.io/deptrac/collectors/){:target="_blank"} per a
seleccionar aquestes capes: per directori, per _namespace_ de la classe, per nom de funció...
- Regles (_rulesets_): són les regles que defineixen les comunicacions permeses entre capes. Per exemple, la capa
d'aplicació pot accedir a la capa de domini. Per defecte, no hi ha cap dependència permesa entre capes, sempre s'han
Expand Down Expand Up @@ -124,7 +124,7 @@ En teoria, el nostre domini només ha de contenir codi PHP pur, és a dir, sense
certes llibreries que volem fer servir al nostre domini, com per exemple la llibreria `ramsey/uuid` per a generar UUID o
les llibreries `brick/math` i `brick/money`, que ens permeten treballar amb nombres i imports monetaris al nostre
domini. Un altre exemple habitual és el
de [`doctrine/collections`](https://www.doctrine-project.org/projects/collections.html): quan fem servir Doctrine com a
de [`doctrine/collections`](https://www.doctrine-project.org/projects/collections.html){:target="_blank"}: quan fem servir Doctrine com a
ORM, les relacions entre entitats han de ser objectes del tipus `Doctrine\Common\Collection`.

El domini, segons hem explicat, hauria de ser pur, però hi ha vegades en què hem de fer concessions: val la pena
Expand Down Expand Up @@ -185,7 +185,7 @@ La sortida de l'execució és similar a això:
-------------------- -----
```

Deptrac ofereix [diversos formatadors](https://qossmic.github.io/deptrac/formatters/), que no cobrirem en aquest post.
Deptrac ofereix [diversos formatadors](https://qossmic.github.io/deptrac/formatters/){:target="_blank"}, que no cobrirem en aquest post.

## Conclusions

Expand Down
Binary file added images/android-chrome-192x192.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/android-chrome-512x512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/apple-touch-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/favicon-16x16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/favicon-32x32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/favicon.ico
Binary file not shown.
1 change: 1 addition & 0 deletions images/site.webmanifest
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
6 changes: 3 additions & 3 deletions index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ layout: home

# Portada

- 👋 Sóc en Rubén Rubio, enginyer informàtic i graduat en filosofia.
- 🌱 Actualment, sóc sènior PHP _backend_ a [Electromaps](https://www.electromaps.com/ca){:target="_blank"}.
- 👋 Sóc en Rubén Rubio, consultor _backend_ de PHP.
- 🌱 Estic disponible per a contractació externa a empreses. Podeu [consultar els serveis que ofereixo](/sobre-mi/).
- 📃 He estat professor d'enginyeria informàtica a la UAB.
- 🦉 He impartit classes de filosofia a les universitats populars de Granollers i de Caldes de Montbui.
- 📫 Podeu contactar amb mi via Twitter ([@rubenrubiob](https://twitter.com/rubenrubiob)).
- 📫 Podeu contactar amb mi via [Email](mailto:[email protected]) o Twitter ([@rubenrubiob](https://twitter.com/rubenrubiob)).
43 changes: 43 additions & 0 deletions sobre-mi/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Sobre mi

Hola! Sóc en Rubén Rubio.

Sóc desenvolupador PHP més de 12 anys d'experiència. En porto més de 7 aplicant arquitectura hexagonal orientada a
esdeveniments i DDD en projectes. He treballat a empreses com [Filmin](https://www.filmin.es/){:target="_blank"} o
[Electromaps](https://www.electromaps.com/){:target="_blank"}.

Intento sempre escriure codi desacoblat, testejat i tipat, per a assegurar-ne el manteniment i la robustesa. Tinc
present en tot moment el rendiment del codi, per això sempre implemento arquitectures escalables horitzontalment i
orientades a esdeveniments, amb diferents nivells de _caché_. Per a garantir la qualitat, empro sistemes de CI/CD amb
diferents eines que comproven els tests, el tipat, les dependències transitives...

Acostumo a treballar amb Symfony des de la seva versió 2.1 (del setembre de 2012), però no tinc cap problema en tocar
cap altre _framework_: al cap i a la fi, no són més que un detall de la capa d'infraestructura.

Actualment sóc consultor PHP. Algunes de les coses en què us puc ajudar són les següents:

- Modernitzar codi _legacy_ per a fer-lo més mantenible:
- Desacoblar-lo del _framework_ i pujada de versió de PHP.
- Introducció de bones pràctiques de testing i d'eines de qualitat.
- Optimització de projectes (codi, database, caching...).
- Pipeline de CI/CD.
- Implementació de cercadors amb Elasticsearch.
- Dockerització.
- Introducció de sistemes de mètriques.
- Integracions amb sistemes externs com AWS.
- Desenvolupament de projectes des de 0.

A més a més, ofereixo formacions a empreses a tots els nivells, des dels més introductoris als més experts, en els
següents temes:

- DDD
- Arquitectura hexagonal
- Testing
- Event-driven
- Rendiment i optimització

Podeu veure codi meu en el repositori d'exemples pel
blog: [rubenrubiob/blog-src](https://github.com/rubenrubiob/blog-src){:target="_blank"}. Podeu consultar [tots els meus articles de
desenvolupament](/dev).

Podeu contactar amb mi a [[email protected]](mailto:[email protected]).

0 comments on commit ce84a67

Please sign in to comment.