diff --git a/README.md b/README.md index df2760284..d1eeb12d5 100644 --- a/README.md +++ b/README.md @@ -144,19 +144,19 @@ You can use one of the solutions: To add images to your article, you will need to create the folder `_assets/articles/YYYY-MM-DD-slug/` and add your images there. Then in the markdown content, insert the tag: ```md -![alt of image]({{ site.baseurl }}/assets/YYYY-MM-DD-slug/image-name.png) +![alt of image]({BASE_URL}/imgs/articles/YYYY-MM-DD-slug/image-name.png) ``` To add an image with a figure and a figcaption you just need to write this syntax: ```md -![alt of image]({{ site.baseurl }}/assets/YYYY-MM-DD-slug/image-name.png) +![alt of image]({BASE_URL}/imgs/articles/YYYY-MM-DD-slug/image-name.png) Figure: *Source Github* ``` And to specify a size on the image, you can add the arguments (`width`, `height`, `maxWidth`, `maxHeight`) after the url: ```md -![alt of image]({{ site.baseurl }}/assets/YYYY-MM-DD-slug/image-name.png?width=500) +![alt of image]({BASE_URL}/imgs/articles/YYYY-MM-DD-slug/image-name.png?width=500) ``` > Warning: Don't add html in your markdown, you don't have to override the blog template in the markdown. diff --git a/_articles/en/2016-07-13-how-to-be-best-friend-with-the-http-cache.md b/_articles/en/2016-07-13-how-to-be-best-friend-with-the-http-cache.md index 5d88f989e..625dc0c54 100644 --- a/_articles/en/2016-07-13-how-to-be-best-friend-with-the-http-cache.md +++ b/_articles/en/2016-07-13-how-to-be-best-friend-with-the-http-cache.md @@ -157,7 +157,7 @@ It acts like the CDN, and the CDN belongs to the architecture. It often concerns #### The Web Server The web server also allows you to use the HTTP cache, it is generally used for the cache of assets (JS, CSS, images, etc.). Like Varnish, its advantage is to be very finely configurable. -![Architecture Http](/_assets/articles/2016-06-29-le-cache-http-votre-meilleur-ami/untitled.png) +![Architecture Http]({BASE_URL}/imgs/articles/2016-06-29-le-cache-http-votre-meilleur-ami/untitled.png) ### Customizing your HTTP cache diff --git a/_articles/en/2016-07-19-behat-structure-functional-tests.md b/_articles/en/2016-07-19-behat-structure-functional-tests.md index 3d5dab01d..af84ab405 100644 --- a/_articles/en/2016-07-19-behat-structure-functional-tests.md +++ b/_articles/en/2016-07-19-behat-structure-functional-tests.md @@ -35,7 +35,7 @@ Before we can go, please note that we will use a `Selenium` server which will r To be clear on the architecture we will use, here is a scheme that will resume the role of all elements: -!["Behat architecture schema"](/_assets/articles/2016-07-19-behat-structure-functional-tests/behat_en.jpg) +!["Behat architecture schema"]({BASE_URL}/imgs/articles/2016-07-19-behat-structure-functional-tests/behat_en.jpg) ## Behat set up First step is to install Behat and its extensions as dependencies in our `composer.json` file: diff --git a/_articles/en/2016-09-29-mtools-mongodb.md b/_articles/en/2016-09-29-mtools-mongodb.md index f1a6cfdd4..41eb57833 100644 --- a/_articles/en/2016-09-29-mtools-mongodb.md +++ b/_articles/en/2016-09-29-mtools-mongodb.md @@ -81,7 +81,7 @@ More info [here](https://github.com/rueckstiess/mtools/wiki/mlogfilter). Those tools allows you to generate graphics to visualize data in a human-readable format. We can see : calls distribution, type of commands, etc : -![mlogvis](/_assets/articles/2016-09-29-mtools-mongodb/mlogvis.png) +![mlogvis]({BASE_URL}/imgs/articles/2016-09-29-mtools-mongodb/mlogvis.png) More info on [Mlogvis](https://github.com/rueckstiess/mtools/wiki/mlogvis) & [Mplotqueries](https://github.com/rueckstiess/mtools/wiki/mplotqueries). @@ -133,6 +133,6 @@ This command is creating a MongoDB server with 5 replicas. Compass is a desktop client allowing you to browse and analyze data from a MongoDB database. Its goal is to allow a person to manipulate data without real knowledges on MongoDB querying. However, it's only available on Windows and MacOS yet. -![date-sample](/_assets/articles/2016-09-29-mtools-mongodb/date-sample.png) +![date-sample]({BASE_URL}/imgs/articles/2016-09-29-mtools-mongodb/date-sample.png) -![query-builder](/_assets/articles/2016-09-29-mtools-mongodb/query-builder.png) +![query-builder]({BASE_URL}/imgs/articles/2016-09-29-mtools-mongodb/query-builder.png) diff --git a/_articles/en/2016-09-29-symfony-workflow-component.md b/_articles/en/2016-09-29-symfony-workflow-component.md index 2fbf95ce7..3814e0a6f 100644 --- a/_articles/en/2016-09-29-symfony-workflow-component.md +++ b/_articles/en/2016-09-29-symfony-workflow-component.md @@ -119,7 +119,7 @@ $ bin/console workflow:dump pull_request The generated Graphviz will give you the following diagram: -![Workflow Graphviz](/_assets/articles/2016-09-29-symfony-workflow-component/workflow.png) +![Workflow Graphviz]({BASE_URL}/imgs/articles/2016-09-29-symfony-workflow-component/workflow.png) This one gives you a really clear vision of your workflow and allows everyone at every level (developers, product owners, customers, ...) to understand the business logic. The Workflow component implements methods that allow you to verify if a transition is applicable and to later apply it depending on the current status and to also list all enabled transitions. diff --git a/_articles/en/2016-11-21-push-notification-website.md b/_articles/en/2016-11-21-push-notification-website.md index a0f6175cc..6876912c2 100644 --- a/_articles/en/2016-11-21-push-notification-website.md +++ b/_articles/en/2016-11-21-push-notification-website.md @@ -36,15 +36,15 @@ At this point, you should have access to your PWA at localhost:8080. If you hav Before getting into sending push notifications, we are going to go through the configuration. Yes! It's not magic, we are going to ask Google for authorization. Let's go to [Firebase](https://console.firebase.google.com/) to create a project. -![Firebase - créer un projet](/_assets/articles/2016-11-21-push-notification-website/newproject.png) +![Firebase - créer un projet]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/newproject.png) Feel free to choose any name for the project. Once you are on the dashboard, you have to click the small wheel, and then "Project settings". -![](/_assets/articles/2016-11-21-push-notification-website/settings-1.png) +![]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/settings-1.png) In the "Cloud messaging" tab you'll find your sender ID. -![](/_assets/articles/2016-11-21-push-notification-website/cloud.png) +![]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/cloud.png) In the manifest.json, available in the public folder of the application, you have to add at the end of the file the "gsm_sender_id" with the value of the sender ID. @@ -98,7 +98,7 @@ if('serviceWorker' in navigator) { As you would expect, if you restart your server, you'll have a request to accept the notifications. -![PWA - Autoriser les notifications](/_assets/articles/2016-11-21-push-notification-website/capture-decran-2016-10-26-a-15.34.14.png) +![PWA - Autoriser les notifications]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/capture-decran-2016-10-26-a-15.34.14.png) You should also see in your console a message such as: @@ -109,7 +109,7 @@ endpoint: cV2kP3sOb24:APA91bHfZgFSPQ3CXyG9LejWdq9jOT-WqQpvK4peX9ZZtrfsHCf6OPEvDe This is the device token, we will use it to send a push notification. Since we want to do something clean (even if it's just a tutorial), we are going to use Firebase to store user tokens. To do so, let's go back to the Firebase console, and click "Web setup" in the "Authentication" tab. -![](/_assets/articles/2016-11-21-push-notification-website/web_setup.png) +![]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/web_setup.png) The script installation is done in the HTML code, in files public/home.html and public/article/alorscettearticle.html. @@ -202,11 +202,11 @@ Before starting the server, you have to open permissions to Firebase in order fo } ``` -![](/_assets/articles/2016-11-21-push-notification-website/rules.png) +![]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/rules.png) If you restart the server, you will see a token stored in the DB in the "Database" tab of Firebase. -![](/_assets/articles/2016-11-21-push-notification-website/capture-decran-2016-10-26-a-16.24.58.png) +![]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/capture-decran-2016-10-26-a-16.24.58.png) Now that the tokens are stored in the database, we are going to prepare a message that will appear when a push notification occurs. Let's add the following code to the file public/sw.js: @@ -262,15 +262,15 @@ It's almost ready! We are going to create a "/sender" url that will allow us t In the app.js file, we initialize Firebase. You are going to need a server key file. Click the wheel in Firebase, and then "Permissions". You are now taken to another console. -![](/_assets/articles/2016-11-21-push-notification-website/permissions.png) +![]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/permissions.png) In "Service accounts", create a new account. -![](/_assets/articles/2016-11-21-push-notification-website/account.png) +![]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/account.png) A json file will be downloaded, you need to add it to your project folder. -![JsonFile - Racine](/_assets/articles/2016-11-21-push-notification-website/capture-decran-2016-10-26-a-17.22.04.png) +![JsonFile - Racine]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/capture-decran-2016-10-26-a-17.22.04.png) In the app.js file, we are going to add the route /sender that will send a request of a push notification with all the tokens. @@ -330,11 +330,11 @@ app.listen(8080, function () { Be careful! The authorization key is in the first tab that we opened. -![](/_assets/articles/2016-11-21-push-notification-website/cloud.png) +![]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/cloud.png) If everything is ok, when you restart the server and go to / and then /sender, you will get a notification. If it isn't the case, clear the cache of your application in the chrome console. -![Enfin - la push notification](/_assets/articles/2016-11-21-push-notification-website/capture-decran-2016-10-26-a-17.46.23.png) +![Enfin - la push notification]({BASE_URL}/imgs/articles/2016-11-21-push-notification-website/capture-decran-2016-10-26-a-17.46.23.png) Once again, this code is only a tutorial, I invite you to open issues for any question. The finale code is available [here](https://github.com/CaptainJojo/pwa-parisjs/tree/push). diff --git a/_articles/en/2016-12-05-create-atom-package.md b/_articles/en/2016-12-05-create-atom-package.md index f53e4e980..dfd760d0a 100644 --- a/_articles/en/2016-12-05-create-atom-package.md +++ b/_articles/en/2016-12-05-create-atom-package.md @@ -108,7 +108,7 @@ Atom settings allow multiple setting types (`boolean` , `color` , `integer` , Once it is added, if you reload your package, you will see your package settings appearing into Atom settings: -![Gitlab URL Parameter](/_assets/articles/2016-12-05-create-atom-package/gitlab-url.png) +![Gitlab URL Parameter]({BASE_URL}/imgs/articles/2016-12-05-create-atom-package/gitlab-url.png) In order to retrieve the value (or default value) defined by a user for a given setting in your code, you just have to use the following line: @@ -222,7 +222,7 @@ In order to run the specs tests, you just have to navigate into the following me Our package is now ready to be deployed! Let's send it. -![Publish](/_assets/articles/2016-12-05-create-atom-package/publish.gif) +![Publish]({BASE_URL}/imgs/articles/2016-12-05-create-atom-package/publish.gif) To do that, we will use the `apm` CLI tool which comes with Atom when installing it. diff --git a/_articles/en/2016-12-21-understanding-ssltls-part-1.md b/_articles/en/2016-12-21-understanding-ssltls-part-1.md index c5b7a3306..990c2d5d9 100644 --- a/_articles/en/2016-12-21-understanding-ssltls-part-1.md +++ b/_articles/en/2016-12-21-understanding-ssltls-part-1.md @@ -44,7 +44,7 @@ SSL and TLS are invisible to the user, and don't require a usage of protocol of _OSI Model with SSL/TLS_ -![tls-in-osi](/_assets/articles/2016-12-21-understanding-ssltls-part-1/tls-in-osi.png) +![tls-in-osi]({BASE_URL}/imgs/articles/2016-12-21-understanding-ssltls-part-1/tls-in-osi.png) _Bottom line:_ diff --git a/_articles/en/2017-01-12-mobile-development-start.md b/_articles/en/2017-01-12-mobile-development-start.md index 1ab9ed223..32ea13c31 100644 --- a/_articles/en/2017-01-12-mobile-development-start.md +++ b/_articles/en/2017-01-12-mobile-development-start.md @@ -43,7 +43,7 @@ Android's WebView is based on Chromium. For iOS, it's Safari, and it's Internet Thus, Ionic doesn't allow creating native mobile applications strictly speaking. We'll be talking about hybrid applications instead. -*Ionic representation schema*:![schema1](/_assets/articles/2017-01-12-mobile-development-start/Schema1.png) +*Ionic representation schema*:![schema1]({BASE_URL}/imgs/articles/2017-01-12-mobile-development-start/Schema1.png) I can see you coming: "AngularJS, great, I have it under control, let's go". @@ -90,7 +90,7 @@ But Ionic has weaknesses as well: *Compatibility table with Cordova:* -![platform-support](/_assets/articles/2017-01-12-mobile-development-start/platform-support.png) +![platform-support]({BASE_URL}/imgs/articles/2017-01-12-mobile-development-start/platform-support.png) **Conclusion:** diff --git a/_articles/en/2017-01-20-redux-structure-frontend-applications.md b/_articles/en/2017-01-20-redux-structure-frontend-applications.md index 5224649ed..2bff92924 100644 --- a/_articles/en/2017-01-20-redux-structure-frontend-applications.md +++ b/_articles/en/2017-01-20-redux-structure-frontend-applications.md @@ -23,7 +23,7 @@ Historically, this has been needed by [React](https://facebook.github.io/react/ Here is the philosophy: -![Flux Diagram](/_assets/articles/2017-01-20-redux-structure-frontend-applications/flux-diagram.png) +![Flux Diagram]({BASE_URL}/imgs/articles/2017-01-20-redux-structure-frontend-applications/flux-diagram.png) Your application declare `actions` for each components. These actions allow you to define the state of your data which is stored in a `store` . This stores continually maintains your `view` up-to-date. We have a drawback in this case because you have to define one store per component. This is working but on large applications you can feel limited with it. diff --git a/_articles/en/2017-01-31-rabbitmq-publish-consume-retry-messages.md b/_articles/en/2017-01-31-rabbitmq-publish-consume-retry-messages.md index 085a5c3ed..193a686c9 100644 --- a/_articles/en/2017-01-31-rabbitmq-publish-consume-retry-messages.md +++ b/_articles/en/2017-01-31-rabbitmq-publish-consume-retry-messages.md @@ -6,7 +6,7 @@ slug: rabbitmq-publish-consume-retry-messages title: 'RabbitMQ: Publish, Consume, and Retry Messages' excerpt: >- ![Swarrot - Logo](/_assets/articles/2017-01-23-publier-consommer-reessayer-des-messages-rabbitmq/logo.png) + Logo]({BASE_URL}/imgs/articles/2017-01-23-publier-consommer-reessayer-des-messages-rabbitmq/logo.png) categories: - php authors: @@ -16,7 +16,7 @@ keywords: - rabbitmq - symfony --- -![Swarrot Logo](/_assets/articles/2017-01-23-publier-consommer-reessayer-des-messages-rabbitmq/logo.png) +![Swarrot Logo]({BASE_URL}/imgs/articles/2017-01-23-publier-consommer-reessayer-des-messages-rabbitmq/logo.png) RabbitMQ is a message broker, allowing to process things asynchronously. There's already an [article](https://blog.eleven-labs.com/fr/creer-rpc-rabbitmq/) written about it, if you're not familiar with RabbitMQ. @@ -77,11 +77,11 @@ Create binding between exchange default and queue send_astronaut_to_space (with If you connect to the RabbitMQ management interface (ex: http://127.0.0.1:15672/), many things will appear: -![Capture of exchanges created](/_assets/articles/2017-01-23-publier-consommer-reessayer-des-messages-rabbitmq/create_exchanges.png) +![Capture of exchanges created]({BASE_URL}/imgs/articles/2017-01-23-publier-consommer-reessayer-des-messages-rabbitmq/create_exchanges.png) Click on the _Exchanges_ tab: an exchange named _default_ has been created, with a binding to our queue as indicated in our terminal. -![Capture of queues created](/_assets/articles/2017-01-23-publier-consommer-reessayer-des-messages-rabbitmq/create_queues.png) +![Capture of queues created]({BASE_URL}/imgs/articles/2017-01-23-publier-consommer-reessayer-des-messages-rabbitmq/create_queues.png) Now click on the _Queues_ tab: _send_astronaut_to_space_ is also here. diff --git a/_articles/en/2017-02-22-consul-service-discovery-failure-detection.md b/_articles/en/2017-02-22-consul-service-discovery-failure-detection.md index 9d56a446d..44c6277b2 100644 --- a/_articles/en/2017-02-22-consul-service-discovery-failure-detection.md +++ b/_articles/en/2017-02-22-consul-service-discovery-failure-detection.md @@ -37,7 +37,7 @@ In order to clarify the rest of the article, here are the ports used by Consul: Next, we'll focus on service discovery and failure detection. To do that, we'll create a Docker Swarm cluster with the following architecture: -![Consul Infrastructure Schema](/_assets/articles/2017-02-22-consul-service-discovery-failure/schema.png) +![Consul Infrastructure Schema]({BASE_URL}/imgs/articles/2017-02-22-consul-service-discovery-failure/schema.png) As you can see, we'll have 3 Docker machines: @@ -265,7 +265,7 @@ $ docker run -d \ You can do the same thing on your node 02 (by paying attention to modify the `node-01` values to `node-02` ) and you should now visualize these checks on the Consul web UI: -![Consul Infrastructure Schema](/_assets/articles/2017-02-22-consul-service-discovery-failure/checks.png) +![Consul Infrastructure Schema]({BASE_URL}/imgs/articles/2017-02-22-consul-service-discovery-failure/checks.png) You can also use the Consul API in order to verify the good health of your services: diff --git a/_articles/en/2017-03-15-cqrs-pattern-2.md b/_articles/en/2017-03-15-cqrs-pattern-2.md index 5a5c42736..40151af6f 100644 --- a/_articles/en/2017-03-15-cqrs-pattern-2.md +++ b/_articles/en/2017-03-15-cqrs-pattern-2.md @@ -21,7 +21,7 @@ A command is defined as a method that changes state. On the contrary, a query on The following schema shows a basic implementation of the CQRS pattern inside an application. All messages are sent through commands and events. Let's take a closer look at this. -![Example of implementation of CQRS pattern](/_assets/articles/2015-04-07-cqrs-pattern/cqrs_pattern.png) +![Example of implementation of CQRS pattern]({BASE_URL}/imgs/articles/2015-04-07-cqrs-pattern/cqrs_pattern.png) *Example of implementation of CQRS pattern* We can clearly see the separation between writing parts and reading ones: the user does a modification on his page, resulting in a command being executed. Once this command is fully handled, an event is dispatched to signal a modification. diff --git a/_articles/en/2017-04-12-http2-future-present.md b/_articles/en/2017-04-12-http2-future-present.md index a4887883b..e8dd01dcc 100644 --- a/_articles/en/2017-04-12-http2-future-present.md +++ b/_articles/en/2017-04-12-http2-future-present.md @@ -32,7 +32,7 @@ After a first step made by Google in 2009 with the `SPDY` protocol, `HTTP/2` Nowadays, HTTP/2 protocol is supported by most browsers and it's important to point out. While writing this blog post, only Opera Mini does not implement the new protocol, as shown on the following table: -![Can I use HTTP/2?](/_assets/articles/2017-04-12-http2-future-present/caniuse.jpg) +![Can I use HTTP/2?]({BASE_URL}/imgs/articles/2017-04-12-http2-future-present/caniuse.jpg) That being said, you can consider upgrading your own web applications to HTTP/2 as soon as possible and thus offer high browsing performances to your visitors. @@ -52,13 +52,13 @@ If you want more information about how to [improve SSL exchanges security](http HTTP/1 resources were loaded one by one as you can see below on a HTTP/1 application waterfall. HTTP/2 will allow to gain a lot of time on "waiting time" because multiple resources could be sent/downloaded by the client using the same HTTP stream (which is often called binary stream). -![Waterfall HTTP?](/_assets/articles/2017-04-12-http2-future-present/waterfall_http.jpg) +![Waterfall HTTP?]({BASE_URL}/imgs/articles/2017-04-12-http2-future-present/waterfall_http.jpg) Here, time passed and displayed in green color is corresponding to wait time before resource loading. Purple time is corresponding to resource loading time (TTFB - Time To First Byte) and finally the grey time is corresponding on the resource reception to the client. Here is a waterfall of resources loading using the HTTP/2 protocol: -![Waterfall HTTP/2?](/_assets/articles/2017-04-12-http2-future-present/waterfall_http2.jpg) +![Waterfall HTTP/2?]({BASE_URL}/imgs/articles/2017-04-12-http2-future-present/waterfall_http2.jpg) You can clearly see here that time allocated to wait on resources (old-green time) has disappeared completely and all resources are clearly loaded in the same time because they are in the same stream. diff --git a/_articles/en/2017-04-20-upload-file-ajax.md b/_articles/en/2017-04-20-upload-file-ajax.md index 25e8c878d..31ad1f90e 100644 --- a/_articles/en/2017-04-20-upload-file-ajax.md +++ b/_articles/en/2017-04-20-upload-file-ajax.md @@ -269,7 +269,7 @@ A **ProgressEvent** object passed to the **onUploadProgress** callback function. Small demo in GIF and full code here [https://github.com/lepiaf/file-upload](https://github.com/lepiaf/file-upload) -![](/_assets/articles/2017-04-20-upload-file-ajax/upload.gif) +![]({BASE_URL}/imgs/articles/2017-04-20-upload-file-ajax/upload.gif) ### To conclude diff --git a/_articles/en/2017-06-14-amp-web-3-0.md b/_articles/en/2017-06-14-amp-web-3-0.md index 168b14e35..5439f2693 100644 --- a/_articles/en/2017-06-14-amp-web-3-0.md +++ b/_articles/en/2017-06-14-amp-web-3-0.md @@ -24,11 +24,11 @@ Google, the undisputed leader in web services (search, pub, analytics ...), has If you follow the digital news and use google search a lot, you have very likely already seen the following "cards" in your mobile searches : -![](/_assets/articles/2017-06-14-amp-web-3-0/croped-1.png) +![]({BASE_URL}/imgs/articles/2017-06-14-amp-web-3-0/croped-1.png) Yes, that's AMP. A place of choice in Google search, but also a new way of browsing between websites. Indeed, if you click on one of the cards you will not be on the website that sent the content (you will understand why later) but you will stay at Google's, which will allow you to slide between each page of the search: -![](/_assets/articles/2017-06-14-amp-web-3-0/capture-decran-2017-05-29-a-10.38.18.png) +![]({BASE_URL}/imgs/articles/2017-06-14-amp-web-3-0/capture-decran-2017-05-29-a-10.38.18.png) Interesting don't you think? But there is more to it, if you look more carefully you will realize that the AMP website is vastly faster than your own. diff --git a/_articles/en/2017-07-05-take-care-your-mails.md b/_articles/en/2017-07-05-take-care-your-mails.md index 70ad9e828..3d6a26ea0 100644 --- a/_articles/en/2017-07-05-take-care-your-mails.md +++ b/_articles/en/2017-07-05-take-care-your-mails.md @@ -24,15 +24,15 @@ The most common mean of communication between a provider and its customer is the You should have seen it in your Gmail mailbox, in some cases your mails have a different display or even an extra button (like a call-to-action). -![](/_assets/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-20.20.36.png) +![]({BASE_URL}/imgs/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-20.20.36.png) > Example: Booking an event -![](/_assets/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-20.26.14.png) +![]({BASE_URL}/imgs/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-20.26.14.png) > Example: Your next trip -![](/_assets/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-20.29.24.png) +![]({BASE_URL}/imgs/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-20.29.24.png) > Exemple: Un call-to-action @@ -178,9 +178,9 @@ As Google knows you better than yourself, you can do Google searches that will p I invite you to type **my flights**, **my orders**, **my reservations**, you will be surprised. -![](/_assets/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-21.11.52.png) +![]({BASE_URL}/imgs/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-21.11.52.png) -![](/_assets/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-21.11.11.png) +![]({BASE_URL}/imgs/articles/2017-07-05-take-care-your-mails/capture-decran-2017-05-30-a-21.11.11.png) ### Conclusion diff --git a/_articles/en/2017-07-19-video-live-dash-hls.md b/_articles/en/2017-07-19-video-live-dash-hls.md index 73af3e3d5..1d3f1eb15 100644 --- a/_articles/en/2017-07-19-video-live-dash-hls.md +++ b/_articles/en/2017-07-19-video-live-dash-hls.md @@ -35,7 +35,7 @@ Major streaming platforms use this protocol to serve their live video streams or A diagram explains it better than a long speech: -![Operating diagram- HLS ]({{ site.baseurl }}/assets/2017-07-12-video-live-dash-hls/diagram_HLS.png) +![Operating diagram- HLS ]({BASE_URL}/imgs/articles/2017-07-12-video-live-dash-hls/diagram_HLS.png) Here we see the workflow that allows the raw audio/video to reach the client as a stream. The segmented files, usually in MPEG-2 TS format, are accessed via a "manifest", an index file in M3U format that describes content segments as well as metadata that the client can/must use. This file is basically an URL playlist. @@ -85,7 +85,7 @@ live/low.m3u8 Each `#EXT-X-STREAM-INF` tag indicates the data needed to read the segment, each of them of a given quality and encoding. Thus, the compatible client will be able to switch from one quality to another in real time, depending on the available bandwidth or the user's choice. The following diagram illustrates this possibility very well: -![M3U file - HLS ]({{ site.baseurl }}/assets/2017-07-12-video-live-dash-hls/HLS_Figure_1.jpg) +![M3U file - HLS ]({BASE_URL}/imgs/articles/2017-07-12-video-live-dash-hls/HLS_Figure_1.jpg) ### JS library @@ -125,7 +125,7 @@ DASH, in addition to being ISO-standardized, has several features not found in o Once again, let's use a good diagram: -![Operating diagram - DASH ]({{ site.baseurl }}/assets/2017-07-12-video-live-dash-hls/diagram_DASH.png) +![Operating diagram - DASH ]({BASE_URL}/imgs/articles/2017-07-12-video-live-dash-hls/diagram_DASH.png) The different sequences of content are again of a given size, quality and encoding and are sent to the client via HTTP. The client is responsible for selecting and displaying the sequences in the desired quality. And always in the right order. Trust me, this is important. diff --git a/_articles/en/2017-08-03-continuous-improvement-how-to-run-agile-retrospective.md b/_articles/en/2017-08-03-continuous-improvement-how-to-run-agile-retrospective.md index 54c39799e..be43fd5f2 100644 --- a/_articles/en/2017-08-03-continuous-improvement-how-to-run-agile-retrospective.md +++ b/_articles/en/2017-08-03-continuous-improvement-how-to-run-agile-retrospective.md @@ -5,8 +5,7 @@ date: '2017-08-03' slug: continuous-improvement-how-to-run-agile-retrospective title: 'Continuous improvement: how to run your Agile retrospective?' excerpt: "We usually share\_on this blog our technical expertise around web and mobile development or\_architecture. Today, I would like to address another expertise, equally important: our methodology." -cover: >- - /assets/2017-02-16-amelioration-continue-comment-animer-vos-retrospectives-agiles/post-it-heart-retrospective.jpg +cover: /assets/2017-02-16-amelioration-continue-comment-animer-vos-retrospectives-agiles/post-it-heart-retrospective.jpg categories: - agile authors: @@ -24,7 +23,7 @@ At Eleven Labs, our agile methodology is mainly based on the SCRUM framework. I We will focus on the SCRUM sprint retrospective in the context of a web development project, but most of the tools mentioned here could be used with any other agile frameworks and almost all types of projects. -[![SCRUM Sprint Retrospective](/_assets/articles/2017-02-16-amelioration-continue-comment-animer-vos-retrospectives-agiles/eleven-labs-scrum-sprint-focus-retrospective.png)](/_assets/articles/2017-02-16-amelioration-continue-comment-animer-vos-retrospectives-agiles/eleven-labs-scrum-sprint-focus-retrospective.png) +[![SCRUM Sprint Retrospective]({BASE_URL}/imgs/articles/2017-02-16-amelioration-continue-comment-animer-vos-retrospectives-agiles/eleven-labs-scrum-sprint-focus-retrospective.png)]({BASE_URL}/imgs/articles/2017-02-16-amelioration-continue-comment-animer-vos-retrospectives-agiles/eleven-labs-scrum-sprint-focus-retrospective.png) *
Important
@@ -217,7 +217,7 @@ _getCurrentPosition() { }); } ``` -![]({{ site.baseurl }}/assets/2020-02-05-open-street-map-une-alternative-a-google-map/current-position-js.jpeg) +![]({BASE_URL}/imgs/articles/2020-02-05-open-street-map-une-alternative-a-google-map/current-position-js.jpeg) ### Étape 2 : Localisation en PHP diff --git a/_articles/fr/2020-02-11-cheat-sheet-docker.md b/_articles/fr/2020-02-11-cheat-sheet-docker.md index 183631a1f..1f99c0312 100644 --- a/_articles/fr/2020-02-11-cheat-sheet-docker.md +++ b/_articles/fr/2020-02-11-cheat-sheet-docker.md @@ -25,6 +25,6 @@ Nous avons créé pour vous une Cheat Sheet qui vous permettra de retrouver rapi [Pour télécharger la cheat sheet, cliquez ici](http://bit.ly/cheat-sheet-Docker) -![cheat-sheet-docker]({{site.baseurl}}/assets/2020-02-11-cheat-sheet-docker/button.png) +![cheat-sheet-docker]({BASE_URL}/imgs/articles/2020-02-11-cheat-sheet-docker/button.png) Des questions, ou simplement envie d'échanger sur ce sujet ? N'hésitez pas à laisser un commentaire :) diff --git a/_articles/fr/2020-03-10-introduction-a-arangodb-part-1.md b/_articles/fr/2020-03-10-introduction-a-arangodb-part-1.md index 837436a8f..3cd55ebfb 100644 --- a/_articles/fr/2020-03-10-introduction-a-arangodb-part-1.md +++ b/_articles/fr/2020-03-10-introduction-a-arangodb-part-1.md @@ -18,7 +18,7 @@ keywords: - base de données multi-modèles - graphe --- -![]({{ site.baseurl }}/assets/2020-03-10-introduction-a-arangodb-part-1/ArangoDB_logo.webp) +![]({BASE_URL}/imgs/articles/2020-03-10-introduction-a-arangodb-part-1/ArangoDB_logo.webp) ## ArangoDB c'est quoi? ArangoDB est une base de données multi-modèles, ce qui veut dire qu'elle prend en charge plusieurs types de données nativement. @@ -49,7 +49,7 @@ ArangoDB vient également avec des notions de réseau et vous laisse choisir ent - l'instance de base de données (DB Server) : responsable de l'écriture et lecture des données. -![]({{ site.baseurl }}/assets/2020-03-10-introduction-a-arangodb-part-1/cluster.webp) +![]({BASE_URL}/imgs/articles/2020-03-10-introduction-a-arangodb-part-1/cluster.webp) ## Installation @@ -69,14 +69,14 @@ docker run -p 8529:8529 -e ARANGO_ROOT_PASSWORD=rocketEleven arangodb/arangodb:3 ## Interface Même si Arango de base expose par défaut une API REST pour pouvoir communiquer via le protocole HTTP, une interface graphique est également disponible. Pour nous ce sera à l'adresse [http://localhost:8529](http://localhost:8529). -![]({{ site.baseurl }}/assets/2020-03-10-introduction-a-arangodb-part-1/login.webp) +![]({BASE_URL}/imgs/articles/2020-03-10-introduction-a-arangodb-part-1/login.webp) Le login admin par défaut est "root", et le mot de passe est celui fourni dans la ligne de commande ci-dessus, en l'occurrence "rocketEleven". -![]({{ site.baseurl }}/assets/2020-03-10-introduction-a-arangodb-part-1/selectDBView.webp) +![]({BASE_URL}/imgs/articles/2020-03-10-introduction-a-arangodb-part-1/selectDBView.webp) Chaque serveur a par défaut une base de données "_system", sélectionnez-la. -![]({{ site.baseurl }}/assets/2020-03-10-introduction-a-arangodb-part-1/dashboard.png) +![]({BASE_URL}/imgs/articles/2020-03-10-introduction-a-arangodb-part-1/dashboard.png) Nous accédons enfin au dashboard de l'instance, qui présente quelques statistiques (le nombre de requêtes par seconde, le type de requête, le nombre de connexions, mémoire, CPU, etc) À savoir que par défaut ArangoDB choisit l'architecture "single instance". Si on avait choisi le mode "cluster" nous aurions eu des statistiques sur les nœuds le composant (Coordinator, DB Server, Agency) ainsi que leurs endpoints. diff --git a/_articles/fr/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu.md b/_articles/fr/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu.md index 439972d8f..c1cd8f357 100644 --- a/_articles/fr/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu.md +++ b/_articles/fr/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu.md @@ -37,7 +37,7 @@ Voici des éléments déclencheurs -parmi tant d’autres- d’une **Guerre du B Et pour vous lancer dans cette véritable course contre la montre, vous faire des alliés et pacifier le développement du Produit, voici trois premières **méthodes de priorisation du Backlog** qui pourront très certainement vous accompagner. -![]({{ site.baseurl }}/assets/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu/scoffield-and-blake.jpg) +![]({BASE_URL}/imgs/articles/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu/scoffield-and-blake.jpg) ## Tactique numéro 1 : l’oeil de MoSCoW @@ -74,7 +74,7 @@ Les participants sélectionnent des post-it et viennent les placer dans les diff Ils devront dans un second temps échanger sur les post-its qui font débat. Il est important de bien cadrer l’atelier pour équilibrer le nombre de post-its dans les différentes catégories. Si trop de tickets sont encore en Must Have ou Should Have, demandez aux participants de débattre à nouveau sur les éléments en Must Have pour n’en garder qu’un nombre défini. Répétez l’opération sur les Should Have jusqu’à l’obtention d’un nombre cohérent d’éléments dans chaque catégorie. -![]({{ site.baseurl }}/assets/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu/MoSCoW.jpg) +![]({BASE_URL}/imgs/articles/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu/MoSCoW.jpg) *Cette méthode peut s’avérer inefficace si les différentes parties prenantes manquent d’objectivité ou si les relations sont très conflictuelles entre les différents services. Elle présente néanmoins l’intérêt d’aligner tous les métiers sur des objectifs communs lors d’un atelier assez simple à mettre en place. Cet atelier pourra être répété à intervalle régulier et est un bon moyen d’engager vos parties prenantes !* @@ -155,7 +155,7 @@ Le calcul de l’indicateur WSJF tiendra compte des valeurs suivantes : Pour chacune des valeurs, vous pourrez utiliser la suite de Fibonacci pour les noter. -![]({{ site.baseurl }}/assets/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu/WSJF.jpg) +![]({BASE_URL}/imgs/articles/2020-03-25-la-guerre-du-backlog-n-aura-pas-lieu/WSJF.jpg) Une fois les différentes valeurs notées, vous voilà prêt pour le grand calcul. diff --git a/_articles/fr/2020-03-30-extensions-navigateur.md b/_articles/fr/2020-03-30-extensions-navigateur.md index dc1c4bc67..458ed385d 100644 --- a/_articles/fr/2020-03-30-extensions-navigateur.md +++ b/_articles/fr/2020-03-30-extensions-navigateur.md @@ -20,7 +20,7 @@ keywords: Depuis le début de l’existence des navigateurs, il est possible de les customiser afin d’y ajouter des fonctionnalités. Cela se présentait d'abord presque exclusivement sous la forme de barres d’outils à l'utilité douteuse, pour plus tardivement proposer des extensions présentant un véritable gain pour l’utilisateur. On pourra citer pour les plus connues : µBlock, React Developper Tools, DownloadHelper... Certaines dans d'entre elles ont même été intégrées aux navigateurs. -![]({{ site.baseurl }}/assets/2020-03-30-extensions-navigateur/ie_bar.png) +![]({BASE_URL}/imgs/articles/2020-03-30-extensions-navigateur/ie_bar.png) Ces extensions sont aujourd’hui développées sur la base de Javascript, HTML et CSS. Ce qui rend facile leur accessibilité. Tous les principaux navigateurs se sont accordés autour d’une seule et même API, à quelques légères différences près. Safari par contre continue à utiliser sa propre structure. @@ -118,13 +118,13 @@ browser.storage.sync.set({ ``` On poura éditer cette configuation dans les propriétés de l'extension dans `about:addons` -![]({{ site.baseurl }}/assets/2020-03-30-extensions-navigateur/web_extension_config.png) +![]({BASE_URL}/imgs/articles/2020-03-30-extensions-navigateur/web_extension_config.png) ## Installation Pour installer temporairement son extension il suffit d’ouvrir dans Firefox `about:debugging` et de cliquer sur « Charger un module complémentaire temporaire… » et de sélectionner son fichier manifest.json. Cela nous permet aussi de pouvoir la débuguer. Afin de créer son package .xpi, il faudra passer par la [validation de Mozilla](https://extensionworkshop.com/documentation/publish/submitting-an-add-on/) qui contrôlera la validité du code et signera l’extension. Elle pourra ensuite être distribuée ou même ajoutée dans le store. -![]({{ site.baseurl }}/assets/2020-03-30-extensions-navigateur/web_extension.png) +![]({BASE_URL}/imgs/articles/2020-03-30-extensions-navigateur/web_extension.png) ## La suite Il reste beaucoup à améliorer : diff --git a/_articles/fr/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II.md b/_articles/fr/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II.md index 63f9924fe..c929d956d 100644 --- a/_articles/fr/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II.md +++ b/_articles/fr/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II.md @@ -35,13 +35,13 @@ Dans notre [premier article](https://blog.eleven-labs.com/fr/la-guerre-du-backlo Alors si la guerre du produit est déclarée, voici trois nouvelles méthodologies pour upgrader votre arsenal, “votre stuff”. -![]({{ site.baseurl }}/assets/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II/product-warzone.png) +![]({BASE_URL}/imgs/articles/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II/product-warzone.png) # Tactique numéro 4 : RICE, la bataille de l’impact La méthode **RICE** a été créée par l’équipe d’Intercom, plateforme de centralisation des échanges clients, pour ses propres besoins de priorisation produit. -![]({{ site.baseurl }}/assets/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II/rice-4-piliers.png) +![]({BASE_URL}/imgs/articles/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II/rice-4-piliers.png) Source : Intercom - Illustration: Maddie Edgar @@ -107,7 +107,7 @@ Il s’agit d’estimer un **pourcentage entre 0 et 100 de confiance en la featu Appliquez la formule suivante pour calculer votre score RICE pour chacune des features. -![]({{ site.baseurl }}/assets/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II/rice-formule-de-calcul.png) +![]({BASE_URL}/imgs/articles/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II/rice-formule-de-calcul.png) Source : Intercom - Illustration: Maddie Edgar @@ -184,7 +184,7 @@ N’hésitez pas à rephraser pour les questions dysfonctionnelles pour permettr Chacune des fonctionnalités pourra à la suite des entretiens avec les utilisateurs être située sur la grille suivante : -![]({{ site.baseurl }}/assets/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II/evaltable-kano-model.png) +![]({BASE_URL}/imgs/articles/2020-04-08-la-guerre-du-backlog-n-aura-pas-lieu-part-II/evaltable-kano-model.png) Source : © Daniel Zacarias - Folding Burritos diff --git a/_articles/fr/2020-04-15-visual-regression-testing.md b/_articles/fr/2020-04-15-visual-regression-testing.md index 651f23cc5..25de958e8 100644 --- a/_articles/fr/2020-04-15-visual-regression-testing.md +++ b/_articles/fr/2020-04-15-visual-regression-testing.md @@ -40,7 +40,7 @@ C'est également très pratique si le support ne peut accepter une politique de C'est donc tout naturellement qu'un nouveau type de test est née: les tests de régression visuelle. -![principe de la régression visuelle]({{ site.baseurl }}/assets/2020-04-15-visual-regression-testing/regressionvisuelle.gif) +![principe de la régression visuelle]({BASE_URL}/imgs/articles/2020-04-15-visual-regression-testing/regressionvisuelle.gif) Le but de la régression visuelle est de détecter les changements d'apparence qui ne saurait être mesuré finement, via les snapshots Jest ou les tests unitaires, sachant que le test visuelle est fastidieux pour le développeur et parfois l'erreur ou sa source ne sont pas détectable à l'oeil nu. @@ -56,7 +56,7 @@ On se rend donc compte pourquoi Storybook est si apprécié, il offre un environ Bon pour ceux qui m'ont déjà perdu, je vous ai fait un beau dessin pour illustrer les 3 niveaux de test d'un composant (un bouton) incrémentant un compteur de 1 à chaque clic. -![Les 3 niveaux de test d'un composant]({{ site.baseurl }}/assets/2020-04-15-visual-regression-testing/Untitled.png) +![Les 3 niveaux de test d'un composant]({BASE_URL}/imgs/articles/2020-04-15-visual-regression-testing/Untitled.png) > Super ta régression visuelle Manu mais au final, j'ai des yeux et pour voir les différences, ça suffit. @@ -95,7 +95,7 @@ Allez, venez, laissez faire l'insouciance et entrez dans la danse. --- -![Simba à bien changé entre 2 versions]({{ site.baseurl }}/assets/2020-04-15-visual-regression-testing/Untitled1.png) +![Simba à bien changé entre 2 versions]({BASE_URL}/imgs/articles/2020-04-15-visual-regression-testing/Untitled1.png) Chroma s'articule sur 3 points: @@ -109,7 +109,7 @@ S'ajoute alors tout le sel pour agrémenter ces features: - Gestion des viewports pour les composants responsive, - Gestion de version des composants (permettant des rollbacks) -![Chromatic workflow]({{ site.baseurl }}/assets/2020-04-15-visual-regression-testing/workflow-chromatic.gif) +![Chromatic workflow]({BASE_URL}/imgs/articles/2020-04-15-visual-regression-testing/workflow-chromatic.gif) L'installation est relativement simple: diff --git a/_articles/fr/2020-04-29-munin-monitoring-odin.md b/_articles/fr/2020-04-29-munin-monitoring-odin.md index 18c1ff57f..c7f2631c3 100644 --- a/_articles/fr/2020-04-29-munin-monitoring-odin.md +++ b/_articles/fr/2020-04-29-munin-monitoring-odin.md @@ -84,7 +84,7 @@ sudo service munin-node restart Les fichiers statiques de l’interface web devraient maintenant être disponibles dans le dossier indiqué précédemment dans la configuration (ligne `htmldir`) : -![]({{ site.baseurl }}/assets/2020-04-29-munin-monitoring-odin/eleven-master.png) +![]({BASE_URL}/imgs/articles/2020-04-29-munin-monitoring-odin/eleven-master.png) Le monitoring de votre machine “Master” est donc bien en place. Voyons maintenant la suite. @@ -141,6 +141,6 @@ sudo service munin-node restart Au bout de quelques minutes, le temps que Munin récupère les informations du Node fraîchement ajouté, vous devriez voir apparaître votre seconde machine dans l’interface web : -![]({{ site.baseurl }}/assets/2020-04-29-munin-monitoring-odin/eleven-node.png) +![]({BASE_URL}/imgs/articles/2020-04-29-munin-monitoring-odin/eleven-node.png) Votre instance de Munin est maintenant en place. Vous pouvez à tout moment configurer des outils de monitoring spécifiques (apache, mysql, nginx, etc) grace aux [plugins issus de la communauté](http://gallery.munin-monitoring.org/), il y a beaucoup de choses très utiles. diff --git a/_articles/fr/2020-05-06-php-serverless-part-1.md b/_articles/fr/2020-05-06-php-serverless-part-1.md index 7219a6b93..27e337aad 100644 --- a/_articles/fr/2020-05-06-php-serverless-part-1.md +++ b/_articles/fr/2020-05-06-php-serverless-part-1.md @@ -59,7 +59,7 @@ Une autre contrainte est la **durée d'exécution maximale** d'une fonction. Ell Il existe aussi des **limitations** liées à la mémoire, la taille maximum des packages que vous déployez et à l'espace disque disponible. Ci-dessous un extrait des limitations d'AWS Lambda pour vous donner une idée. -![]({{ site.baseurl }}/assets/2020-05-06-php-serverless-part-1/aws-limitations.png) +![]({BASE_URL}/imgs/articles/2020-05-06-php-serverless-part-1/aws-limitations.png) Un autre point à garder en tête est que le **prix** de notre infrastructure peut être **imprévisible**. Etant donné que le fournisseur Cloud s'occupe de tout, nous n'avons aucun contrôle sur la façon dont il gère les ressources. En cas d’événement imprévu qui solliciterait beaucoup nos fonctions serverless, le prix pourrait alors grimper. Rassurez-vous, il est néanmoins possible de créer des alertes et d'être notifié par votre fournisseur Cloud si vous dépassez un certain montant. diff --git a/_articles/fr/2020-05-13-php-serverless-part-2.md b/_articles/fr/2020-05-13-php-serverless-part-2.md index 664df2325..3eecf6597 100644 --- a/_articles/fr/2020-05-13-php-serverless-part-2.md +++ b/_articles/fr/2020-05-13-php-serverless-part-2.md @@ -380,7 +380,7 @@ layers: L'URL à laquelle mon application est accessible est indiquée dans les endpoints. Voici donc le résultat : -![]({{ site.baseurl }}/assets/2020-05-07-php-serverless-part-2/example.png) +![]({BASE_URL}/imgs/articles/2020-05-07-php-serverless-part-2/example.png) Nous avons terminé ! Nous venons de déployer une application Symfony sur AWS Lambda en utilisant Bref. Comme vous avez vu, c'est assez simple au final... diff --git a/_articles/fr/2020-05-20-vous-utilisez-mal-les-states.md b/_articles/fr/2020-05-20-vous-utilisez-mal-les-states.md index db5a6c8df..c67bdb848 100644 --- a/_articles/fr/2020-05-20-vous-utilisez-mal-les-states.md +++ b/_articles/fr/2020-05-20-vous-utilisez-mal-les-states.md @@ -32,7 +32,7 @@ Un **état** (ou **state** dans la langue de Shakespeare) est un ensemble de var Maintenant que nous avons rappelé les bases, regardons maintenant ce qui est bien et ce qui ne l'est pas. -![]({{ site.baseurl }}/assets/2020-05-20-vous-utilisez-mal-les-states/bien-pas-bien.gif) +![]({BASE_URL}/imgs/articles/2020-05-20-vous-utilisez-mal-les-states/bien-pas-bien.gif) ## Tu ne muteras point ton état diff --git a/_articles/fr/2020-08-05-construire-le-story-mapping-de-votre-batmobile.md b/_articles/fr/2020-08-05-construire-le-story-mapping-de-votre-batmobile.md index 8ba51e2cf..8af5de2ba 100644 --- a/_articles/fr/2020-08-05-construire-le-story-mapping-de-votre-batmobile.md +++ b/_articles/fr/2020-08-05-construire-le-story-mapping-de-votre-batmobile.md @@ -101,17 +101,17 @@ Dans mon exemple précédent, je peux typiquement définir les EPICS suivantes : Ces EPICS sont à écrire sur des post-its et à placer sur votre axe horizontal, celui de la “timeline”, qui représente le déroulé des actions de votre utilisateur dans le temps. -![]({{ site.baseurl }}/assets/2020-08-05-construire-le-story-mapping-de-votre-batmobile/EPICS-StoryMapping.PNG) +![]({BASE_URL}/imgs/articles/2020-08-05-construire-le-story-mapping-de-votre-batmobile/EPICS-StoryMapping.PNG) Pour le moment, celui-ci est très large en terme de scope, et c’est normal. Le but étant maintenant, sous chaque EPIC, de rentrer un peu plus dans le détail. Nous allons donc rajouter de nouveaux post-it : les “Features”. Qui représentent les fonctionnalités macro à développer dans chaque EPIC. -![]({{ site.baseurl }}/assets/2020-08-05-construire-le-story-mapping-de-votre-batmobile/Features_StoryMapping.PNG) +![]({BASE_URL}/imgs/articles/2020-08-05-construire-le-story-mapping-de-votre-batmobile/Features_StoryMapping.PNG) Puis, sous ces features, nous allons maintenant pouvoir rajouter toutes les tâches - qui seront directement vos user stories - que cet utilisateur va pouvoir y faire ! -![]({{ site.baseurl }}/assets/2020-08-05-construire-le-story-mapping-de-votre-batmobile/US-StoryMapping.PNG) +![]({BASE_URL}/imgs/articles/2020-08-05-construire-le-story-mapping-de-votre-batmobile/US-StoryMapping.PNG) Vous vous demandez sûrement pourquoi mes post-its “User Stories” sont répartis et séparés par des traits ? Nous y arrivons tout de suite dans la dernière étape ! @@ -125,7 +125,7 @@ Vous pouvez vous servir du [dot voting](https://blog.myagilepartner.fr/index.php Vous arriverez donc à la suite de cette répartition à cela : -![]({{ site.baseurl }}/assets/2020-08-05-construire-le-story-mapping-de-votre-batmobile/Release-StoryMapping.PNG) +![]({BASE_URL}/imgs/articles/2020-08-05-construire-le-story-mapping-de-votre-batmobile/Release-StoryMapping.PNG) De cette manière, vous allez pouvoir laisser en place vos EPICS et Features comme ils sont, puis regrouper toutes vos user stories qui font parties de votre MVP. Tracez ensuite un trait sous ce premier regroupement. Félicitations, vous avez là la constitution de votre premier release ! @@ -133,7 +133,7 @@ Faites ensuite le même travail pour définir les éléments qui sont selon vous Voici la représentation globale de mon Story Mapping, à laquelle vous avez également accès ici : -![]({{ site.baseurl }}/assets/2020-08-05-construire-le-story-mapping-de-votre-batmobile/Global-StoryMapping.PNG) +![]({BASE_URL}/imgs/articles/2020-08-05-construire-le-story-mapping-de-votre-batmobile/Global-StoryMapping.PNG) ## Keep the Story Map Alive diff --git a/_articles/fr/2020-08-12-deno-vs-node.md b/_articles/fr/2020-08-12-deno-vs-node.md index aff4336f8..d18fb6aa9 100644 --- a/_articles/fr/2020-08-12-deno-vs-node.md +++ b/_articles/fr/2020-08-12-deno-vs-node.md @@ -22,7 +22,7 @@ Jetons un coup d'œil aux 5 principales nouveautés qu'offre Deno aux développe ## 1. Du Javascript moderne (ES Modules) -![]({{ site.baseurl }}/assets/2020-08-12-deno-vs-node/modern.png) +![]({BASE_URL}/imgs/articles/2020-08-12-deno-vs-node/modern.png) Si vous êtes un développeur React, vous avez remarqué que la syntaxe d'importation des packages est différente lorsque vous travaillez avec NodeJS. En effet, Node a été créé en 2009, il y a eu de nombreuses mises à jour et améliorations de Javascript depuis lors. @@ -66,7 +66,7 @@ const moment = require("moment") De plus, chaque fois que quelqu'un souhaite exécuter votre dépôt NodeJS localement, il doit installer toutes les dépendances de NPM. Dans Deno, le package est importé à partir d'une URL, donc si vous voulez utiliser moment, vous importez simplement [https://deno.land/x/moment/moment.ts](https://deno.land/x/moment/moment.ts). -![]({{ site.baseurl }}/assets/2020-08-12-deno-vs-node/moment.jpeg) +![]({BASE_URL}/imgs/articles/2020-08-12-deno-vs-node/moment.jpeg) Un autre énorme avantage en ce qui concerne les packages dans Deno, c'est que **chaque package est mis en cache sur le disque dur après l'installation**. @@ -75,7 +75,7 @@ Si vous souhaitez importer à nouveau la dépendance, n'importe où, il ne sera ## 3. Await en top level : Utiliser Await en dehors d'une fonction asynchrone -![]({{ site.baseurl }}/assets/2020-08-12-deno-vs-node/await.png) +![]({BASE_URL}/imgs/articles/2020-08-12-deno-vs-node/await.png) Dans Node, le mot clé *await* n'est accessible que dans une fonction asynchrone. Avec Deno, vous pouvez l'utiliser n'importe où, sans l'encapsuler dans une fonction asynchrone. @@ -84,7 +84,7 @@ Cette mise à niveau rend le code beaucoup plus propre et simple. ## 4. TypeScript natif, aucune configuration nécessaire -![]({{ site.baseurl }}/assets/2020-08-12-deno-vs-node/type.jpeg) +![]({BASE_URL}/imgs/articles/2020-08-12-deno-vs-node/type.jpeg) Faire fonctionner TypeScript avec NodeJS est un processus en plusieurs étapes. Vous devez installer Typescript, mettre à jour package.json, tsconfig.json et vous assurer que vos modules prennent en charge @types. @@ -114,7 +114,7 @@ ainsi que tout autre élément dans l'API du navigateur sans installer de librai Lorsqu'il est combiné avec l'avantage top level d'*await*, vous pouvez maintenant voir à quel point le code Deno est plus simple que le code Node : -![]({{ site.baseurl }}/assets/2020-08-12-deno-vs-node/api.jpeg) +![]({BASE_URL}/imgs/articles/2020-08-12-deno-vs-node/api.jpeg) ## Ça ne s'arrête pas là diff --git a/_articles/fr/2020-08-26-a-la-decouverte-de-mercure.md b/_articles/fr/2020-08-26-a-la-decouverte-de-mercure.md index 57949ab3a..fcbe8db5e 100644 --- a/_articles/fr/2020-08-26-a-la-decouverte-de-mercure.md +++ b/_articles/fr/2020-08-26-a-la-decouverte-de-mercure.md @@ -23,7 +23,7 @@ keywords: Aujourd'hui, je vous fais découvrir ce qu'est [Mercure](https://mercure.rocks/), ses principes, puis on apprendra comment le mettre en place simplement avec Docker. Mercure est un sérieux concurrent aux classiques WebSockets et autres solutions similaires, car il tire parti de nombreuses nouveautés du Web (HTTP/2, SSE, ...) et est supporté nativement par la plupart des navigateurs. -![Logo de Mercure]({{ site.baseurl }}/assets/2020-08-26-a-la-decouverte-de-mercure/mercure_logo.png) +![Logo de Mercure]({BASE_URL}/imgs/articles/2020-08-26-a-la-decouverte-de-mercure/mercure_logo.png) En clair, c'est un **protocole** qui permet d'envoyer des push updates vers tout client HTTP. @@ -57,7 +57,7 @@ Mercure utilise les SSE (Server Sent Events) pour pousser ses UpdatesNote
@@ -86,7 +86,7 @@ Niveau **global** => Niveau **module** => Niveau **controller** => Niveau **rout Reprenons donc une partie de notre schéma vu plus haut, mais mis à jour. Cela donnerait : -![]({{ site.baseurl }}/assets/2022-03-04-nestjs-le-cycle-de-vie-dune-requete/updated-lifecycle-schema.png) +![]({BASE_URL}/imgs/articles/2022-03-04-nestjs-le-cycle-de-vie-dune-requete/updated-lifecycle-schema.png) Ci-dessous à titre indicatif, vous trouverez des exemples de déclaration pour chaque niveau. Rendez-vous dans les prochaines sections pour les présentations plus poussées de toutes nos couches (Middlewares, Interceptors...). diff --git a/_articles/fr/2022-06-13-decouverte-ipython.md b/_articles/fr/2022-06-13-decouverte-ipython.md index 1466ea3ac..ed35276a6 100644 --- a/_articles/fr/2022-06-13-decouverte-ipython.md +++ b/_articles/fr/2022-06-13-decouverte-ipython.md @@ -113,7 +113,7 @@ L'interface Jupyter est quasiment identique à IPython. Il y a des cellules dans Tout est enregistré dans un fichier `.ipynb`. -![Interface Jupyter]({{ site.baseurl }}/assets/2022-06-13-decouverte-ipython/jupyter.png) +![Interface Jupyter]({BASE_URL}/imgs/articles/2022-06-13-decouverte-ipython/jupyter.png) Github met en forme les notebooks Jupyter pour en faciliter la lecture. Par exemple : [https://github.com/jdwittenauer/ipython-notebooks/blob/master/notebooks/ml/ML-Exercise1.ipynb](https://github.com/jdwittenauer/ipython-notebooks/blob/master/notebooks/ml/ML-Exercise1.ipynb) diff --git a/_articles/fr/2022-08-12-top-5-des-pires-erreurs-sous-symfony.md b/_articles/fr/2022-08-12-top-5-des-pires-erreurs-sous-symfony.md index f4c031542..1efe0b4ac 100644 --- a/_articles/fr/2022-08-12-top-5-des-pires-erreurs-sous-symfony.md +++ b/_articles/fr/2022-08-12-top-5-des-pires-erreurs-sous-symfony.md @@ -19,7 +19,7 @@ Je suis développeuse PHP/Symfony depuis près de 10 ans, et au cours de mes mis ## #5 Faire une librairie, alors qu’il s’agit d’un bundle -![Library vs Bundle]({{ site.baseurl }}/assets/2022-08-12-top-5-des-pires-erreurs-sous-symfony/libraryvsbundle.png?width=300) +![Library vs Bundle]({BASE_URL}/imgs/articles/2022-08-12-top-5-des-pires-erreurs-sous-symfony/libraryvsbundle.png?width=300) Combien de fois ai-je vu des soi-disant librairies qui, n'en étant pas (vous allez comprendre ce que j'entends par là très vite), posaient des soucis de maintenabilité sur les projets Symfony ? La réponse est : beaucoup trop. @@ -43,7 +43,7 @@ Un développeur travaille sur le service A qui utilise la library Tools pour la Mais ce développeur n'a pas détecté que sa modification a créé un break change inintentionnel sur le Service B, et comme la librairie n’a pas été mise à jour sur celui-ci, c'est resté invisible. Un autre développeur travaille en parallèle sur, justement, ce Service B et a aussi besoin de modifier cette librairie. Quand il va faire sa branche sur la librairie, cela sera à partir de la branche principale, avec la modification pour la feature 01. Quand la librairie sera mise à jour pour tester la branche spécifique, il y aura une erreur, dont la raison demeurera complètement opaque pour le deuxième développeur... -![Example problème librairies partagées]({{ site.baseurl }}/assets/2022-08-12-top-5-des-pires-erreurs-sous-symfony/librairies-partagees.png?width=600) +![Example problème librairies partagées]({BASE_URL}/imgs/articles/2022-08-12-top-5-des-pires-erreurs-sous-symfony/librairies-partagees.png?width=600) Cela fait perdre du temps pour débugger, car ça implique de solliciter toute son équipe, pour identifier le développeur responsable du break change et corriger ce qui doit l'être. @@ -73,7 +73,7 @@ Grâce à la commande `bin/console debug:event-dispatcher` ou dans le profiler, ## #1 Utiliser API Platform aveuglément -![No API Platform]({{ site.baseurl }}/assets/2022-08-12-top-5-des-pires-erreurs-sous-symfony/no-api-platform.png?width=200) +![No API Platform]({BASE_URL}/imgs/articles/2022-08-12-top-5-des-pires-erreurs-sous-symfony/no-api-platform.png?width=200) API Platform permet de créer rapidement des APIs et cela permet de gagner un temps incroyable en début de projet. Malheureusement, le coût de développement et de maintien vient plus tard et peut être faramineux. diff --git a/_articles/fr/2022-08-24-phpstorm-tips-config-extensions.md b/_articles/fr/2022-08-24-phpstorm-tips-config-extensions.md index 216620d9d..24cdd6723 100644 --- a/_articles/fr/2022-08-24-phpstorm-tips-config-extensions.md +++ b/_articles/fr/2022-08-24-phpstorm-tips-config-extensions.md @@ -17,7 +17,7 @@ keywords: [] Bienvenue dans cet article qui j'espère, vous aidera à gagner en productivité sur l'IDE [PhpStorm](https://www.jetbrains.com/fr-fr/phpstorm/) de la suite JetBrains. Je vais vous parler de mes extensions préférées ainsi que de certains points de configuration méconnus mais très utiles. Prêts ? C'est parti ! -![PhpStorm Logo]({{ site.baseurl }}/assets/2022-08-24-phpstorm-tips-config-extensions/PhpStorm_Icon.png?width=300) +![PhpStorm Logo]({BASE_URL}/imgs/articles/2022-08-24-phpstorm-tips-config-extensions/PhpStorm_Icon.png?width=300) Figure: *PhpStorm* @@ -35,7 +35,7 @@ Comme vous le savez certainement si vous utilisez PhpStorm, les raccourcis clavi Cependant il peut être compliqué de se rappeler de tous les raccourcis qui existent, et de prendre l'habitude de les utiliser. Il faudrait que quelqu'un nous rabache à longueur de journée que ce que nous faisons aurait pu être effectué en un clic avec un raccourci. Devinez quoi ? C'est exactement ce que Key Promoter va faire pour vous. -![Key Promoter notif]({{ site.baseurl }}/assets/2022-08-24-phpstorm-tips-config-extensions/key-promoter-notification.png?width=450) +![Key Promoter notif]({BASE_URL}/imgs/articles/2022-08-24-phpstorm-tips-config-extensions/key-promoter-notification.png?width=450) Figure: *Key Promoter* @@ -55,7 +55,7 @@ Heureusement, PhpStorm possède une extension pour cela, j'ai nommé *CodeGlance -![Codeglance Map]({{ site.baseurl }}/assets/2022-08-24-phpstorm-tips-config-extensions/code-glance-example.png?width=300) +![Codeglance Map]({BASE_URL}/imgs/articles/2022-08-24-phpstorm-tips-config-extensions/code-glance-example.png?width=300) Figure: *Code Glance*