From e2d2ed2faa45de83022922d9cffe94cfc80beab5 Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 16:57:34 +0100 Subject: [PATCH 01/15] cleanup before theme change --- .gitmodules | 8 -------- themes/cocoa | 1 - themes/diary | 1 - 3 files changed, 10 deletions(-) delete mode 160000 themes/cocoa delete mode 160000 themes/diary diff --git a/.gitmodules b/.gitmodules index 313a066..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,8 +0,0 @@ -[submodule "themes/cocoa"] - path = themes/cocoa - url = https://github.com/nmasse-itix/cocoa-hugo-theme.git - branch = nmasse-itix -[submodule "themes/diary"] - path = themes/diary - url = https://github.com/nmasse-itix/hugo-theme-diary.git - branch = www.itix.fr diff --git a/themes/cocoa b/themes/cocoa deleted file mode 160000 index 119b88c..0000000 --- a/themes/cocoa +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 119b88c0f33b5cf23ad894df02ca70a67e39cebc diff --git a/themes/diary b/themes/diary deleted file mode 160000 index f612ddd..0000000 --- a/themes/diary +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f612ddd985c218bf056db32412477acf65f63d6b From 1e4da97fd7f38aed2c96bd73470ab7b6dfed64fc Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 17:19:22 +0100 Subject: [PATCH 02/15] i18n --- config.toml | 71 ------------------ config.yaml | 74 +++++++++++++++++++ content/english/_index.md | 11 +++ .../blog/3scale-toolbox-anonymous-policy.md | 4 +- .../3scale-toolbox-url-rewriting-policy.md | 2 + ...adm-release-mirror-between-environments.md | 2 + .../blog/ansible-add-prefix-suffix-to-list.md | 2 + .../check-ansible-version-number-playbook.md | 2 + .../blog/cleanup-playbook-3scale.md | 6 +- content/{ => english}/blog/cli-world-clock.md | 0 .../blog/configure-redhat-sso-3scale-cli.md | 4 +- .../configure-truststore-apicurio-studio.md | 2 + .../blog/decode-kubernetes-secret-base64.md | 2 + .../blog/deploying-invidious-openshift.md | 2 + .../blog/deploying-miniflux-openshift.md | 2 + .../blog/enable-global-policies-apicast.md | 2 + .../feed-url-drupal-wordpress-wix-youtube.md | 0 .../blog/install-miniflux-raspberry-pi.md | 2 + .../blog/install-openwrt-raspberry-pi.md | 2 + .../blog/install-operator-openshift-cli.md | 3 + .../blog/is-my-ntp-daemon-working.md | 0 .../jmeter-assess-software-performances.md | 23 +++--- .../blog/m4-as-replacement-for-sed.md | 0 .../blog/nginx-with-tls-on-openwrt.md | 2 + .../print-config-file-without-comments.md | 0 .../running-redhat-sso-outside-openshift.md | 2 + ...enshift-4-openid-connect-authentication.md | 0 .../blog/secure-quarkus-api-with-keycloak.md | 0 ...secure-raspberry-pi-keycloak-gatekeeper.md | 0 .../blog/send-mails-openwrt-msmtp-gmail.md | 2 + ...uires-the-openshift-python-client-error.md | 2 + .../testing-hard-drive-ssd-performance.md | 0 ...nage-the-qos-of-your-openshift-workload.md | 2 + ...-google-account-openid-connect-provider.md | 0 .../use-qlkube-to-query-the-kubernetes-api.md | 2 +- ...instructions-with-hugo-deploy-openshift.md | 0 ...rkshop-instructions-with-hugo-variables.md | 0 ...writing-workshop-instructions-with-hugo.md | 0 content/{ => english}/contact/index.md | 4 +- content/english/opensource/_index.md | 6 ++ content/english/speaking/_index.md | 6 ++ .../speaking/adeo-summit-2018.md | 0 .../{ => english}/speaking/apidays-2017.md | 0 .../develop-deploy-deliver-continuously.md | 0 .../speaking/devoteam-tech-for-people-2018.md | 0 .../speaking/devoxx-france-2019.md | 0 .../speaking/red-hat-forum-2017.md | 0 .../speaking/red-hat-forum-helsinki-2019.md | 0 .../speaking/red-hat-summit-2018.md | 0 .../speaking/red-hat-summit-2019.md | 0 .../speaking/red-hat-tech-exchange-2018.md | 0 .../speaking/red-hat-tech-exchange-2019.md | 0 .../speaking/techweek-sg-2019.md | 0 content/english/topics/_index.md | 6 ++ ...cale-toolbox-deploy-an-api-from-the-cli.md | 0 ...eploying-your-api-from-a-ci-cd-pipeline.md | 0 content/english/writing/_index.md | 5 ++ ...pis-as-a-product-get-started-in-no-time.md | 0 ...-product-get-the-value-out-of-your-apis.md | 0 ...deploy-your-api-from-a-jenkins-pipeline.md | 0 .../full-api-lifecycle-management-a-primer.md | 0 ...r-apis-deployed-with-istio-service-mesh.md | 0 ...ingle-sign-on-give-it-a-try-for-no-cost.md | 0 ...te-with-red-hat-single-sign-on-keycloak.md | 0 ...e-3scale-toolbox-jenkins-shared-library.md | 0 content/french/_index.md | 11 +++ content/french/contact/index.md | 15 ++++ content/french/opensource/_index.md | 6 ++ content/french/speaking/_index.md | 6 ++ content/french/topics/_index.md | 6 ++ content/french/writing/_index.md | 7 ++ content/speaking/_index.md | 7 -- content/writing/_index.md | 7 -- 73 files changed, 220 insertions(+), 102 deletions(-) delete mode 100644 config.toml create mode 100644 config.yaml create mode 100644 content/english/_index.md rename content/{ => english}/blog/3scale-toolbox-anonymous-policy.md (99%) rename content/{ => english}/blog/3scale-toolbox-url-rewriting-policy.md (99%) rename content/{ => english}/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md (99%) rename content/{ => english}/blog/ansible-add-prefix-suffix-to-list.md (97%) rename content/{ => english}/blog/check-ansible-version-number-playbook.md (96%) rename content/{ => english}/blog/cleanup-playbook-3scale.md (98%) rename content/{ => english}/blog/cli-world-clock.md (100%) rename content/{ => english}/blog/configure-redhat-sso-3scale-cli.md (99%) rename content/{ => english}/blog/configure-truststore-apicurio-studio.md (99%) rename content/{ => english}/blog/decode-kubernetes-secret-base64.md (97%) rename content/{ => english}/blog/deploying-invidious-openshift.md (99%) rename content/{ => english}/blog/deploying-miniflux-openshift.md (99%) rename content/{ => english}/blog/enable-global-policies-apicast.md (99%) rename content/{ => english}/blog/feed-url-drupal-wordpress-wix-youtube.md (100%) rename content/{ => english}/blog/install-miniflux-raspberry-pi.md (99%) rename content/{ => english}/blog/install-openwrt-raspberry-pi.md (99%) rename content/{ => english}/blog/install-operator-openshift-cli.md (99%) rename content/{ => english}/blog/is-my-ntp-daemon-working.md (100%) rename content/{ => english}/blog/jmeter-assess-software-performances.md (93%) rename content/{ => english}/blog/m4-as-replacement-for-sed.md (100%) rename content/{ => english}/blog/nginx-with-tls-on-openwrt.md (99%) rename content/{ => english}/blog/print-config-file-without-comments.md (100%) rename content/{ => english}/blog/running-redhat-sso-outside-openshift.md (99%) rename content/{ => english}/blog/secure-openshift-4-openid-connect-authentication.md (100%) rename content/{ => english}/blog/secure-quarkus-api-with-keycloak.md (100%) rename content/{ => english}/blog/secure-raspberry-pi-keycloak-gatekeeper.md (100%) rename content/{ => english}/blog/send-mails-openwrt-msmtp-gmail.md (99%) rename content/{ => english}/blog/solving-this-module-requires-the-openshift-python-client-error.md (99%) rename content/{ => english}/blog/testing-hard-drive-ssd-performance.md (100%) rename content/{ => english}/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md (99%) rename content/{ => english}/blog/use-google-account-openid-connect-provider.md (100%) rename content/{ => english}/blog/use-qlkube-to-query-the-kubernetes-api.md (99%) rename content/{ => english}/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md (100%) rename content/{ => english}/blog/writing-workshop-instructions-with-hugo-variables.md (100%) rename content/{ => english}/blog/writing-workshop-instructions-with-hugo.md (100%) rename content/{ => english}/contact/index.md (89%) create mode 100644 content/english/opensource/_index.md create mode 100644 content/english/speaking/_index.md rename content/{ => english}/speaking/adeo-summit-2018.md (100%) rename content/{ => english}/speaking/apidays-2017.md (100%) rename content/{ => english}/speaking/develop-deploy-deliver-continuously.md (100%) rename content/{ => english}/speaking/devoteam-tech-for-people-2018.md (100%) rename content/{ => english}/speaking/devoxx-france-2019.md (100%) rename content/{ => english}/speaking/red-hat-forum-2017.md (100%) rename content/{ => english}/speaking/red-hat-forum-helsinki-2019.md (100%) rename content/{ => english}/speaking/red-hat-summit-2018.md (100%) rename content/{ => english}/speaking/red-hat-summit-2019.md (100%) rename content/{ => english}/speaking/red-hat-tech-exchange-2018.md (100%) rename content/{ => english}/speaking/red-hat-tech-exchange-2019.md (100%) rename content/{ => english}/speaking/techweek-sg-2019.md (100%) create mode 100644 content/english/topics/_index.md rename content/{ => english}/writing/3scale-toolbox-deploy-an-api-from-the-cli.md (100%) rename content/{ => english}/writing/5-principles-for-deploying-your-api-from-a-ci-cd-pipeline.md (100%) create mode 100644 content/english/writing/_index.md rename content/{ => english}/writing/apis-as-a-product-get-started-in-no-time.md (100%) rename content/{ => english}/writing/apis-as-a-product-get-the-value-out-of-your-apis.md (100%) rename content/{ => english}/writing/deploy-your-api-from-a-jenkins-pipeline.md (100%) rename content/{ => english}/writing/full-api-lifecycle-management-a-primer.md (100%) rename content/{ => english}/writing/manage-your-apis-deployed-with-istio-service-mesh.md (100%) rename content/{ => english}/writing/red-hat-single-sign-on-give-it-a-try-for-no-cost.md (100%) rename content/{ => english}/writing/using-a-public-certificate-with-red-hat-single-sign-on-keycloak.md (100%) rename content/{ => english}/writing/using-the-3scale-toolbox-jenkins-shared-library.md (100%) create mode 100644 content/french/_index.md create mode 100644 content/french/contact/index.md create mode 100644 content/french/opensource/_index.md create mode 100644 content/french/speaking/_index.md create mode 100644 content/french/topics/_index.md create mode 100644 content/french/writing/_index.md delete mode 100644 content/speaking/_index.md delete mode 100644 content/writing/_index.md diff --git a/config.toml b/config.toml deleted file mode 100644 index 92b661c..0000000 --- a/config.toml +++ /dev/null @@ -1,71 +0,0 @@ -baseURL = "https://www.itix.fr/" -languageCode = "en-us" -title = "Nicolas Massé" -author = "Nicolas Massé" -theme = "diary" -pygmentsUseClasses = true -pygmentsCodefences = true -enableRobotsTXT = true - -[taxonomies] -opensource = "opensource" -topic = "topics" -tags = "tags" - -[params] -include_rss = true -latestpostscount = 10 -i18n_flags = true -author = "Nicolas Massé" -description = "Nicolas Massé's blog" -github = "//github.com/nmasse-itix" -px500 = "//500px.com/nmasse" -linkedin = "//linkedin.com/in/nicolasmasse" -#selfintro = "TODO intro" -twitter = "//twitter.com/nmasse_itix" -gravatar = "006617bcd9aae1a019e1f923c8bd69e0" -#faviconfile = "images/favicon.ico" - -[menu] - -[[menu.main]] -name = "Home" -weight = 10 -identifier = "home" -url = "/" - -[[menu.main]] -name = "Biography" -weight = 20 -identifier = "biography" -url = "/biography/" - -[[menu.main]] -name = "Blog" -weight = 30 -identifier = "blog" -url = "/blog/" - -[[menu.main]] -name = "Open Source" -weight = 35 -identifier = "opensource" -url = "/opensource/" - -[[menu.main]] -name = "Speaking" -weight = 40 -identifier = "speaking" -url = "/speaking/" - -[[menu.main]] -name = "Writing" -weight = 50 -identifier = "writing" -url = "/writing/" - -[[menu.main]] -name = "Contact" -weight = 60 -identifier = "contact" -url = "/contact/" diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..ed1537c --- /dev/null +++ b/config.yaml @@ -0,0 +1,74 @@ +baseURL: "/" +title: "Nicolas Massé" +author: "Nicolas Massé" +theme: "diary" +# pygmentsUseClasses implies a style sheet that can be generated as follow: +# hugo gen chromastyles --style=borland > static/css/chroma.css +pygmentsUseClasses: true +pygmentsCodefences: true +enableRobotsTXT: true + +defaultContentLanguage: "en" +languages: + en: + weight: 1 + languageName: English + contentDir: content/english + menu: + main: + - name: "Articles" + weight: 10 + url: "/blog/" + - name: "Open Source" + weight: 20 + url: "/opensource/" + - name: "Expertise" + weight: 30 + url: "/topics/" + - name: "Speaking" + weight: 40 + url: "/speaking/" + - name: "Writing" + weight: 50 + url: "/writing/" + - name: "Contact" + weight: 60 + url: "/contact/" + - name: "Resume" + weight: 70 + url: "https://www.linkedin.com/in/nicolasmasse/" + fr: + weight: 2 + languageName: Français + contentDir: content/french + menu: + main: + - name: "Articles" + weight: 10 + url: "/fr/blog/" + - name: "Open Source" + weight: 20 + url: "/fr/opensource/" + - name: "Expertise" + weight: 30 + url: "/fr/topics/" + - name: "Conférences" + weight: 40 + url: "/fr/speaking/" + - name: "Publications" + weight: 50 + url: "/fr/writing/" + - name: "Me contacter" + weight: 60 + url: "/fr/contact/" + - name: "CV" + weight: 70 + url: "https://www.linkedin.com/in/nicolasmasse/" + +taxonomies: + opensource: "opensource" + topic: "topics" + tags: "tags" + +params: + diff --git a/content/english/_index.md b/content/english/_index.md new file mode 100644 index 0000000..73bfafa --- /dev/null +++ b/content/english/_index.md @@ -0,0 +1,11 @@ +--- +title: "Nicolas Massé" +--- + +I am Nicolas Massé, you will find me on social networks under the nickname "nmasse-itix". +Initially developer, I now work as pre-sales consultant in the fields of [API Management]({{}}), [Single Sign On]({{}}) and [Containers]({{}}). + +I mainly work with [Open Source]({{}}) technologies such as [Keycloak]({{}}), [3scale]({{}}) or [OpenShift]({{}}). +I share my [expertise]({{}}) and interests on this site, as a guest [on other websites]({{}}) and I occasionally give [conferences]({{}}). + +Please read [my blog]({{}}) or [learn more about me](https://www.linkedin.com/in/nicolasmasse/). diff --git a/content/blog/3scale-toolbox-anonymous-policy.md b/content/english/blog/3scale-toolbox-anonymous-policy.md similarity index 99% rename from content/blog/3scale-toolbox-anonymous-policy.md rename to content/english/blog/3scale-toolbox-anonymous-policy.md index 467f341..257fe15 100644 --- a/content/blog/3scale-toolbox-anonymous-policy.md +++ b/content/english/blog/3scale-toolbox-anonymous-policy.md @@ -1,8 +1,10 @@ --- title: "What is this 'Anonymous' policy configured by the 3scale toolbox?" date: 2019-11-14T00:00:00+02:00 -opensource: +opensource: - 3scale +topics: +- API Management --- In this article on the Red Hat Developer blog, I explained [how to deploy an API from the CLI, using the 3scale toolbox](https://developers.redhat.com/blog/2019/07/29/3scale-toolbox-deploy-an-api-from-the-cli/). diff --git a/content/blog/3scale-toolbox-url-rewriting-policy.md b/content/english/blog/3scale-toolbox-url-rewriting-policy.md similarity index 99% rename from content/blog/3scale-toolbox-url-rewriting-policy.md rename to content/english/blog/3scale-toolbox-url-rewriting-policy.md index 615b1a7..30165bf 100644 --- a/content/blog/3scale-toolbox-url-rewriting-policy.md +++ b/content/english/blog/3scale-toolbox-url-rewriting-policy.md @@ -3,6 +3,8 @@ title: "What is this 'URL Rewriting' policy configured by the 3scale toolbox?" date: 2019-11-14T00:00:00+02:00 opensource: - 3scale +topics: +- API Management --- In this article on the Red Hat Developer blog, I explained [how to deploy an API from a Jenkins Pipeline, using the 3scale toolbox](https://developers.redhat.com/blog/2019/07/30/deploy-your-api-from-a-jenkins-pipeline/). diff --git a/content/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md b/content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md similarity index 99% rename from content/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md rename to content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md index 1539790..9e82b1e 100644 --- a/content/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md +++ b/content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md @@ -5,6 +5,8 @@ opensource: - Ansible - OpenShift - Skopeo +topics: +- Containers --- Some customers, especially large banks, have very tight security requirements. diff --git a/content/blog/ansible-add-prefix-suffix-to-list.md b/content/english/blog/ansible-add-prefix-suffix-to-list.md similarity index 97% rename from content/blog/ansible-add-prefix-suffix-to-list.md rename to content/english/blog/ansible-add-prefix-suffix-to-list.md index 52c007c..24aa6ff 100644 --- a/content/blog/ansible-add-prefix-suffix-to-list.md +++ b/content/english/blog/ansible-add-prefix-suffix-to-list.md @@ -3,6 +3,8 @@ title: "Ansible: Add a prefix or suffix to all items of a list" date: 2019-11-18T00:00:00+02:00 opensource: - Ansible +topics: +- IT Automation --- Recently, in [one of my Ansible playbooks](../airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments) I had to prefix all items of a list with a chosen string. diff --git a/content/blog/check-ansible-version-number-playbook.md b/content/english/blog/check-ansible-version-number-playbook.md similarity index 96% rename from content/blog/check-ansible-version-number-playbook.md rename to content/english/blog/check-ansible-version-number-playbook.md index d8f25f5..395f617 100644 --- a/content/blog/check-ansible-version-number-playbook.md +++ b/content/english/blog/check-ansible-version-number-playbook.md @@ -3,6 +3,8 @@ title: "Check the Ansible version number in a playbook" date: 2019-11-18T00:00:00+02:00 opensource: - Ansible +topics: +- IT Automation --- My Ansible playbooks sometimes use features that are available only in a very recent versions of Ansible. diff --git a/content/blog/cleanup-playbook-3scale.md b/content/english/blog/cleanup-playbook-3scale.md similarity index 98% rename from content/blog/cleanup-playbook-3scale.md rename to content/english/blog/cleanup-playbook-3scale.md index aa9012b..cc10cd1 100644 --- a/content/blog/cleanup-playbook-3scale.md +++ b/content/english/blog/cleanup-playbook-3scale.md @@ -1,8 +1,12 @@ --- title: "A cleanup playbook for 3scale" date: 2020-04-28T00:00:00+02:00 -opensource: +opensource: - 3scale +- Ansible +topics: +- API Management +- IT Automation --- If you are running integration tests embedding 3scale or are doing a lot of 3scale demos, you might sooner or later **have plenty of services declared in the 3scale Admin console**, which could reveal difficult to work with. diff --git a/content/blog/cli-world-clock.md b/content/english/blog/cli-world-clock.md similarity index 100% rename from content/blog/cli-world-clock.md rename to content/english/blog/cli-world-clock.md diff --git a/content/blog/configure-redhat-sso-3scale-cli.md b/content/english/blog/configure-redhat-sso-3scale-cli.md similarity index 99% rename from content/blog/configure-redhat-sso-3scale-cli.md rename to content/english/blog/configure-redhat-sso-3scale-cli.md index d0ba479..ffef4e2 100644 --- a/content/blog/configure-redhat-sso-3scale-cli.md +++ b/content/english/blog/configure-redhat-sso-3scale-cli.md @@ -3,7 +3,9 @@ title: "Configure Red Hat SSO for 3scale using the CLI!" date: 2020-04-08T00:00:00+02:00 opensource: - 3scale -- keycloak +- Keycloak +topics: +- OpenID Connect --- [3scale API Management](https://3scale.github.io/) can be used in conjunction with [Red Hat SSO](https://access.redhat.com/products/red-hat-single-sign-on) / [Keycloak](https://www.keycloak.org/) to secure APIs managed by 3scale using the OpenID Connect protocol. diff --git a/content/blog/configure-truststore-apicurio-studio.md b/content/english/blog/configure-truststore-apicurio-studio.md similarity index 99% rename from content/blog/configure-truststore-apicurio-studio.md rename to content/english/blog/configure-truststore-apicurio-studio.md index 69b97ff..547ce81 100644 --- a/content/blog/configure-truststore-apicurio-studio.md +++ b/content/english/blog/configure-truststore-apicurio-studio.md @@ -4,6 +4,8 @@ date: 2019-10-25T00:00:00+02:00 opensource: - Apicurio - Microcks +topics: +- API Management --- [Microcks](http://microcks.github.io) and [Apicurio](https://www.apicur.io/) are nice Open Source projects that can even talk to each other to deliver greater value than the sum of their parts. diff --git a/content/blog/decode-kubernetes-secret-base64.md b/content/english/blog/decode-kubernetes-secret-base64.md similarity index 97% rename from content/blog/decode-kubernetes-secret-base64.md rename to content/english/blog/decode-kubernetes-secret-base64.md index 4c22ad5..5d86d75 100644 --- a/content/blog/decode-kubernetes-secret-base64.md +++ b/content/english/blog/decode-kubernetes-secret-base64.md @@ -3,6 +3,8 @@ title: "One-liner to decode a Kubernetes secret (base64 encoded)" date: 2019-06-07T00:00:00+02:00 opensource: - OpenShift +topics: +- Containers --- Creating a Kubernetes secret from a value is easy: diff --git a/content/blog/deploying-invidious-openshift.md b/content/english/blog/deploying-invidious-openshift.md similarity index 99% rename from content/blog/deploying-invidious-openshift.md rename to content/english/blog/deploying-invidious-openshift.md index c904166..077e345 100644 --- a/content/blog/deploying-invidious-openshift.md +++ b/content/english/blog/deploying-invidious-openshift.md @@ -4,6 +4,8 @@ date: 2019-11-16T00:00:00+02:00 opensource: - OpenShift - Invidious +topics: +- Containers --- [Invidious](https://github.com/omarroth/invidious) is an alternative frontend to YouTube that is slimmer, faster and at the same time offer more features than YouTube itself. And even more important: it's Open Source! diff --git a/content/blog/deploying-miniflux-openshift.md b/content/english/blog/deploying-miniflux-openshift.md similarity index 99% rename from content/blog/deploying-miniflux-openshift.md rename to content/english/blog/deploying-miniflux-openshift.md index c0f31a6..017ed8c 100644 --- a/content/blog/deploying-miniflux-openshift.md +++ b/content/english/blog/deploying-miniflux-openshift.md @@ -4,6 +4,8 @@ date: 2019-11-17T00:00:00+02:00 opensource: - OpenShift - Miniflux +topics: +- Containers --- [Miniflux](https://miniflux.app) is a minimalist, open source and opinionated RSS feed reader. There is a [hosted instance](https://miniflux.app/hosting.html) available at a fair price point but wouldn't it be cooler to host your own instance on your OpenShift cluster? Let's do it! diff --git a/content/blog/enable-global-policies-apicast.md b/content/english/blog/enable-global-policies-apicast.md similarity index 99% rename from content/blog/enable-global-policies-apicast.md rename to content/english/blog/enable-global-policies-apicast.md index af7a110..21d534b 100644 --- a/content/blog/enable-global-policies-apicast.md +++ b/content/english/blog/enable-global-policies-apicast.md @@ -3,6 +3,8 @@ title: "Enable global policies on Apicast 3.6" date: 2019-09-10T00:00:00+02:00 opensource: - 3scale +topics: +- API Management --- Recent versions of Apicast have a pluggable policy mechanism to apply different treatments to each exposed API. diff --git a/content/blog/feed-url-drupal-wordpress-wix-youtube.md b/content/english/blog/feed-url-drupal-wordpress-wix-youtube.md similarity index 100% rename from content/blog/feed-url-drupal-wordpress-wix-youtube.md rename to content/english/blog/feed-url-drupal-wordpress-wix-youtube.md diff --git a/content/blog/install-miniflux-raspberry-pi.md b/content/english/blog/install-miniflux-raspberry-pi.md similarity index 99% rename from content/blog/install-miniflux-raspberry-pi.md rename to content/english/blog/install-miniflux-raspberry-pi.md index 6dd5017..50d57a0 100644 --- a/content/blog/install-miniflux-raspberry-pi.md +++ b/content/english/blog/install-miniflux-raspberry-pi.md @@ -3,6 +3,8 @@ title: "Install Miniflux on your Raspberry PI" date: 2020-04-08T00:00:00+02:00 opensource: - OpenWRT +topics: +- Embedded Systems --- In the article "[Nginx with TLS on OpenWRT](../nginx-with-tls-on-openwrt/)", I explained how to install Nginx with TLS support on a Raspberry PI. diff --git a/content/blog/install-openwrt-raspberry-pi.md b/content/english/blog/install-openwrt-raspberry-pi.md similarity index 99% rename from content/blog/install-openwrt-raspberry-pi.md rename to content/english/blog/install-openwrt-raspberry-pi.md index 3c456c8..0824f16 100644 --- a/content/blog/install-openwrt-raspberry-pi.md +++ b/content/english/blog/install-openwrt-raspberry-pi.md @@ -3,6 +3,8 @@ title: "Install OpenWRT on your Raspberry PI" date: 2019-12-19T00:00:00+02:00 opensource: - OpenWRT +topics: +- Embedded Systems --- [OpenWRT](https://openwrt.org/) is a Linux distribution for embedded systems. diff --git a/content/blog/install-operator-openshift-cli.md b/content/english/blog/install-operator-openshift-cli.md similarity index 99% rename from content/blog/install-operator-openshift-cli.md rename to content/english/blog/install-operator-openshift-cli.md index f98bf38..a90b254 100644 --- a/content/blog/install-operator-openshift-cli.md +++ b/content/english/blog/install-operator-openshift-cli.md @@ -3,6 +3,9 @@ title: "Install Kubernetes operators in OpenShift using only the CLI" date: 2020-04-24T00:00:00+02:00 opensource: - OpenShift +topics: +- Containers +- Kubernetes Operators --- OpenShift 4 went all-in on Kubernetes operators: they are used for installation of the platform itself but also to install databases, middlewares, etc. diff --git a/content/blog/is-my-ntp-daemon-working.md b/content/english/blog/is-my-ntp-daemon-working.md similarity index 100% rename from content/blog/is-my-ntp-daemon-working.md rename to content/english/blog/is-my-ntp-daemon-working.md diff --git a/content/blog/jmeter-assess-software-performances.md b/content/english/blog/jmeter-assess-software-performances.md similarity index 93% rename from content/blog/jmeter-assess-software-performances.md rename to content/english/blog/jmeter-assess-software-performances.md index f220b17..da0d9fa 100644 --- a/content/blog/jmeter-assess-software-performances.md +++ b/content/english/blog/jmeter-assess-software-performances.md @@ -2,9 +2,11 @@ title: "Use JMeter to assess software performances" date: 2020-07-24T00:00:00+02:00 opensource: -- jmeter -topic: -- performance-testing +- JMeter +topics: +- Performance testing +resources: +- '**.png' --- One of my side projects (the [Telegram Photo Bot](https://github.com/nmasse-itix/Telegram-Photo-Album-Bot)), have some performance issues that I will have to tackle. @@ -17,6 +19,7 @@ To keep this article short and readable, I focused on the assessment of two HTTP ## Hardware setup +### Test 1 When building my lab, I chose the smallest computer I had at home to host the thing to be assessed. The reason is: the more powerful is the server, the more steady needs the network setup to be, the more powerful the injector needs to be. If the rest of your setup is not up to the task, you are measuring something that is not the performances of the thing but rather the performances of your network or the injector itself! @@ -25,7 +28,7 @@ We will see a good demonstration of this in the rest of the article. So, the target hardware is an ARMv5 board with only one core running at 1.2 GHz, 128 MB of RAM and 256 MB of Flash. It was [a cheap NAS device](https://www.cnet.com/reviews/seagate-goflex-home-network-storage-system-review/) in its previous life. I installed [OpenWRT](/opensource/openwrt/) on this little device. - +### Test 2 The injector is hosted on my Macbook Pro, a Core i7 at 2.5 GHz. This will provide a comfortable margin before reaching the limits of the injector. @@ -100,7 +103,7 @@ http { My first measure on the control (nginx) gave strange results. -![control1](control1.png) +{{< figure src="control1.png" title="First measure gave results too low to be representative of nginx's performances." >}} Less than 30 tps, even on an old ARM board, is definitely too low to be representative of nginx's performances. Using [Wireshark](https://www.wireshark.org/), I discovered that JMeter did not established [Keep-Alive connections](https://sqa.stackexchange.com/questions/38211/re-using-the-tcp-connections-with-jmeter-like-a-real-browser). @@ -133,13 +136,13 @@ httpclient.reset_state_on_thread_group_iteration=false With Keep-Alive enabled, the 1200 tps are much more inline with the known performance level of nginx. Except there is a performance drop every 10-15 seconds that is not expected. -![control2](control2.png) +{{< figure src="control2.png" title="Second measure shows a periodic performance drop." >}} Using Wireshark, I discovered that during those performance drops, there are [TCP packets retransmissions](https://wiki.wireshark.org/DuplicatePackets). At that time, my Macbook Pro hosting the injector was connected **using Wifi**. I switched to a good old Ethernet cable, and this time the results on the control were as expected. -![control3](control3.png) +{{< figure src="control3.png" title="Third measure is ok." >}} As a conclusion, always have a control in your experience! @@ -147,7 +150,7 @@ As a conclusion, always have a control in your experience! To build my JMeter Test Plan, I started by adding a **User Defined Variables** component that holds all the settings related to lab environment (DNS names, ports, tokens, etc.). -![udv](udv.png) +{{< figure src="udv.png" title="JMeter User Defined Variables" >}} I added a variable named **scenario** whose value will be passed to JMeter from the CLI. This enables me to run all my experiments automatically from a script, one after another. @@ -159,12 +162,12 @@ ${__P(parameter-name,default-value)} I configured a **Thread Group** based on the **jp@gc - Ultimate Thread Group** with five concurrent users. -![thread-group](thread-group.png) +{{< figure src="thread-group.png" title="JMeter Thread Group" >}} And finally, a **Loop** component with three **If Controllers** underneath. Each **If Controller** holds an **HTTP Probe** configured for the target scenario. -![if](if.png) +{{< figure src="if.png" title="JMeter If Controller" >}} The If Controllers are defined with a **jexl3** expression, asserting the value of the **scenario** variable. diff --git a/content/blog/m4-as-replacement-for-sed.md b/content/english/blog/m4-as-replacement-for-sed.md similarity index 100% rename from content/blog/m4-as-replacement-for-sed.md rename to content/english/blog/m4-as-replacement-for-sed.md diff --git a/content/blog/nginx-with-tls-on-openwrt.md b/content/english/blog/nginx-with-tls-on-openwrt.md similarity index 99% rename from content/blog/nginx-with-tls-on-openwrt.md rename to content/english/blog/nginx-with-tls-on-openwrt.md index fcabce5..637d645 100644 --- a/content/blog/nginx-with-tls-on-openwrt.md +++ b/content/english/blog/nginx-with-tls-on-openwrt.md @@ -4,6 +4,8 @@ date: 2019-12-19T00:00:00+02:00 opensource: - OpenWRT - nginx +topics: +- Embedded Systems --- In the article "[Install OpenWRT on your Raspberry PI](../install-openwrt-raspberry-pi/)", I explained how to install OpenWRT on a Raspberry PI and the first steps as an OpenWRT user. diff --git a/content/blog/print-config-file-without-comments.md b/content/english/blog/print-config-file-without-comments.md similarity index 100% rename from content/blog/print-config-file-without-comments.md rename to content/english/blog/print-config-file-without-comments.md diff --git a/content/blog/running-redhat-sso-outside-openshift.md b/content/english/blog/running-redhat-sso-outside-openshift.md similarity index 99% rename from content/blog/running-redhat-sso-outside-openshift.md rename to content/english/blog/running-redhat-sso-outside-openshift.md index 605bbba..568a88c 100644 --- a/content/blog/running-redhat-sso-outside-openshift.md +++ b/content/english/blog/running-redhat-sso-outside-openshift.md @@ -3,6 +3,8 @@ title: "Running Red Hat SSO outside of OpenShift" date: 2019-10-10T00:00:00+02:00 opensource: - Keycloak +topics: +- Containers --- In an article named [Red Hat Single Sign-On: Give it a try for no cost!](https://developers.redhat.com/blog/2019/02/07/red-hat-single-sign-on-give-it-a-try-for-no-cost/), I explained how to deploy Red Hat SSO very easily in any OpenShift cluster. diff --git a/content/blog/secure-openshift-4-openid-connect-authentication.md b/content/english/blog/secure-openshift-4-openid-connect-authentication.md similarity index 100% rename from content/blog/secure-openshift-4-openid-connect-authentication.md rename to content/english/blog/secure-openshift-4-openid-connect-authentication.md diff --git a/content/blog/secure-quarkus-api-with-keycloak.md b/content/english/blog/secure-quarkus-api-with-keycloak.md similarity index 100% rename from content/blog/secure-quarkus-api-with-keycloak.md rename to content/english/blog/secure-quarkus-api-with-keycloak.md diff --git a/content/blog/secure-raspberry-pi-keycloak-gatekeeper.md b/content/english/blog/secure-raspberry-pi-keycloak-gatekeeper.md similarity index 100% rename from content/blog/secure-raspberry-pi-keycloak-gatekeeper.md rename to content/english/blog/secure-raspberry-pi-keycloak-gatekeeper.md diff --git a/content/blog/send-mails-openwrt-msmtp-gmail.md b/content/english/blog/send-mails-openwrt-msmtp-gmail.md similarity index 99% rename from content/blog/send-mails-openwrt-msmtp-gmail.md rename to content/english/blog/send-mails-openwrt-msmtp-gmail.md index d9bf376..6c55341 100644 --- a/content/blog/send-mails-openwrt-msmtp-gmail.md +++ b/content/english/blog/send-mails-openwrt-msmtp-gmail.md @@ -3,6 +3,8 @@ title: "Send mails on OpenWRT with MSMTP and Gmail" date: 2020-04-08T00:00:00+02:00 opensource: - OpenWRT +topics: +- Embedded Systems --- A previous article named "[Install OpenWRT on your Raspberry PI](../install-openwrt-raspberry-pi/)" goes through the setup process to use OpenWRT on your Raspberry PI. diff --git a/content/blog/solving-this-module-requires-the-openshift-python-client-error.md b/content/english/blog/solving-this-module-requires-the-openshift-python-client-error.md similarity index 99% rename from content/blog/solving-this-module-requires-the-openshift-python-client-error.md rename to content/english/blog/solving-this-module-requires-the-openshift-python-client-error.md index 36fddf1..1751b65 100644 --- a/content/blog/solving-this-module-requires-the-openshift-python-client-error.md +++ b/content/english/blog/solving-this-module-requires-the-openshift-python-client-error.md @@ -4,6 +4,8 @@ date: 2019-09-13T00:00:00+02:00 opensource: - OpenShift - Ansible +topics: +- IT Automation --- If you are using MacOS to develop Operators based on Ansible or simply running Ansible playbooks straight from your Mac, you might encounter this error: diff --git a/content/blog/testing-hard-drive-ssd-performance.md b/content/english/blog/testing-hard-drive-ssd-performance.md similarity index 100% rename from content/blog/testing-hard-drive-ssd-performance.md rename to content/english/blog/testing-hard-drive-ssd-performance.md diff --git a/content/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md b/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md similarity index 99% rename from content/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md rename to content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md index 50f2486..2dcbf91 100644 --- a/content/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md +++ b/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md @@ -4,6 +4,8 @@ date: 2019-02-06T00:00:00+02:00 opensource: - OpenShift - Ansible +topics: +- IT Automation --- As I was administering my OpenShift cluster, I found out that I had a too diff --git a/content/blog/use-google-account-openid-connect-provider.md b/content/english/blog/use-google-account-openid-connect-provider.md similarity index 100% rename from content/blog/use-google-account-openid-connect-provider.md rename to content/english/blog/use-google-account-openid-connect-provider.md diff --git a/content/blog/use-qlkube-to-query-the-kubernetes-api.md b/content/english/blog/use-qlkube-to-query-the-kubernetes-api.md similarity index 99% rename from content/blog/use-qlkube-to-query-the-kubernetes-api.md rename to content/english/blog/use-qlkube-to-query-the-kubernetes-api.md index a5cd4c6..ff1ed66 100644 --- a/content/blog/use-qlkube-to-query-the-kubernetes-api.md +++ b/content/english/blog/use-qlkube-to-query-the-kubernetes-api.md @@ -3,7 +3,7 @@ title: "Use QLKube to query the Kubernetes API" date: 2019-06-07T00:00:00+02:00 opensource: - OpenShift -topic: +topics: - GraphQL --- diff --git a/content/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md similarity index 100% rename from content/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md rename to content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md diff --git a/content/blog/writing-workshop-instructions-with-hugo-variables.md b/content/english/blog/writing-workshop-instructions-with-hugo-variables.md similarity index 100% rename from content/blog/writing-workshop-instructions-with-hugo-variables.md rename to content/english/blog/writing-workshop-instructions-with-hugo-variables.md diff --git a/content/blog/writing-workshop-instructions-with-hugo.md b/content/english/blog/writing-workshop-instructions-with-hugo.md similarity index 100% rename from content/blog/writing-workshop-instructions-with-hugo.md rename to content/english/blog/writing-workshop-instructions-with-hugo.md diff --git a/content/contact/index.md b/content/english/contact/index.md similarity index 89% rename from content/contact/index.md rename to content/english/contact/index.md index 1df59db..7f1b639 100644 --- a/content/contact/index.md +++ b/content/english/contact/index.md @@ -1,7 +1,5 @@ --- title: "Contact me" -date: 2018-01-01T00:00:00+02:00 -draft: false --- Do you need something from me ? @@ -11,7 +9,7 @@ email address or on twitter at [@nmasse_itix](https://twitter.com/nmasse_itix). ![My Email](/images/my-email.png) -If you want to know more about my professional career, you can find it on [Linkedin](https://www.linkedin.com/in/nicolasmasse/) but I can also provide a current CV or bio upon request. +If you want to know more about my professional career, you can find it on [Linkedin](https://www.linkedin.com/in/nicolasmasse/) but I can also provide a current CV or biography upon request. If you are reaching out to me for one of my [Open Source projects](https://github.com/nmasse-itix?tab=repositories) or one of my contributions, please open an issue in the relevant GitHub repository diff --git a/content/english/opensource/_index.md b/content/english/opensource/_index.md new file mode 100644 index 0000000..7064469 --- /dev/null +++ b/content/english/opensource/_index.md @@ -0,0 +1,6 @@ +--- +title: "Open Source" +--- + +In my daily work I use many Open Source communities, on which I have written articles. +Each Open Source community below is a link to the list of matching articles. diff --git a/content/english/speaking/_index.md b/content/english/speaking/_index.md new file mode 100644 index 0000000..f60661f --- /dev/null +++ b/content/english/speaking/_index.md @@ -0,0 +1,6 @@ +--- +title: "Speaking" +--- + +I am occasionally invited to customers or corporate events to talk about APIs and SSO. +I have compiled the list of my latest talks below. diff --git a/content/speaking/adeo-summit-2018.md b/content/english/speaking/adeo-summit-2018.md similarity index 100% rename from content/speaking/adeo-summit-2018.md rename to content/english/speaking/adeo-summit-2018.md diff --git a/content/speaking/apidays-2017.md b/content/english/speaking/apidays-2017.md similarity index 100% rename from content/speaking/apidays-2017.md rename to content/english/speaking/apidays-2017.md diff --git a/content/speaking/develop-deploy-deliver-continuously.md b/content/english/speaking/develop-deploy-deliver-continuously.md similarity index 100% rename from content/speaking/develop-deploy-deliver-continuously.md rename to content/english/speaking/develop-deploy-deliver-continuously.md diff --git a/content/speaking/devoteam-tech-for-people-2018.md b/content/english/speaking/devoteam-tech-for-people-2018.md similarity index 100% rename from content/speaking/devoteam-tech-for-people-2018.md rename to content/english/speaking/devoteam-tech-for-people-2018.md diff --git a/content/speaking/devoxx-france-2019.md b/content/english/speaking/devoxx-france-2019.md similarity index 100% rename from content/speaking/devoxx-france-2019.md rename to content/english/speaking/devoxx-france-2019.md diff --git a/content/speaking/red-hat-forum-2017.md b/content/english/speaking/red-hat-forum-2017.md similarity index 100% rename from content/speaking/red-hat-forum-2017.md rename to content/english/speaking/red-hat-forum-2017.md diff --git a/content/speaking/red-hat-forum-helsinki-2019.md b/content/english/speaking/red-hat-forum-helsinki-2019.md similarity index 100% rename from content/speaking/red-hat-forum-helsinki-2019.md rename to content/english/speaking/red-hat-forum-helsinki-2019.md diff --git a/content/speaking/red-hat-summit-2018.md b/content/english/speaking/red-hat-summit-2018.md similarity index 100% rename from content/speaking/red-hat-summit-2018.md rename to content/english/speaking/red-hat-summit-2018.md diff --git a/content/speaking/red-hat-summit-2019.md b/content/english/speaking/red-hat-summit-2019.md similarity index 100% rename from content/speaking/red-hat-summit-2019.md rename to content/english/speaking/red-hat-summit-2019.md diff --git a/content/speaking/red-hat-tech-exchange-2018.md b/content/english/speaking/red-hat-tech-exchange-2018.md similarity index 100% rename from content/speaking/red-hat-tech-exchange-2018.md rename to content/english/speaking/red-hat-tech-exchange-2018.md diff --git a/content/speaking/red-hat-tech-exchange-2019.md b/content/english/speaking/red-hat-tech-exchange-2019.md similarity index 100% rename from content/speaking/red-hat-tech-exchange-2019.md rename to content/english/speaking/red-hat-tech-exchange-2019.md diff --git a/content/speaking/techweek-sg-2019.md b/content/english/speaking/techweek-sg-2019.md similarity index 100% rename from content/speaking/techweek-sg-2019.md rename to content/english/speaking/techweek-sg-2019.md diff --git a/content/english/topics/_index.md b/content/english/topics/_index.md new file mode 100644 index 0000000..eea2d7e --- /dev/null +++ b/content/english/topics/_index.md @@ -0,0 +1,6 @@ +--- +title: "Expertise" +--- + +During my various interventions on customer site, I had to work on various subjects for which I have written one or more articles. +Each subject is a link to the list of matching articles. diff --git a/content/writing/3scale-toolbox-deploy-an-api-from-the-cli.md b/content/english/writing/3scale-toolbox-deploy-an-api-from-the-cli.md similarity index 100% rename from content/writing/3scale-toolbox-deploy-an-api-from-the-cli.md rename to content/english/writing/3scale-toolbox-deploy-an-api-from-the-cli.md diff --git a/content/writing/5-principles-for-deploying-your-api-from-a-ci-cd-pipeline.md b/content/english/writing/5-principles-for-deploying-your-api-from-a-ci-cd-pipeline.md similarity index 100% rename from content/writing/5-principles-for-deploying-your-api-from-a-ci-cd-pipeline.md rename to content/english/writing/5-principles-for-deploying-your-api-from-a-ci-cd-pipeline.md diff --git a/content/english/writing/_index.md b/content/english/writing/_index.md new file mode 100644 index 0000000..25c2845 --- /dev/null +++ b/content/english/writing/_index.md @@ -0,0 +1,5 @@ +--- +title: "Writing" +--- + +I post articles from time to time on various websites as a guest. I have gathered a list of my recent posts below. diff --git a/content/writing/apis-as-a-product-get-started-in-no-time.md b/content/english/writing/apis-as-a-product-get-started-in-no-time.md similarity index 100% rename from content/writing/apis-as-a-product-get-started-in-no-time.md rename to content/english/writing/apis-as-a-product-get-started-in-no-time.md diff --git a/content/writing/apis-as-a-product-get-the-value-out-of-your-apis.md b/content/english/writing/apis-as-a-product-get-the-value-out-of-your-apis.md similarity index 100% rename from content/writing/apis-as-a-product-get-the-value-out-of-your-apis.md rename to content/english/writing/apis-as-a-product-get-the-value-out-of-your-apis.md diff --git a/content/writing/deploy-your-api-from-a-jenkins-pipeline.md b/content/english/writing/deploy-your-api-from-a-jenkins-pipeline.md similarity index 100% rename from content/writing/deploy-your-api-from-a-jenkins-pipeline.md rename to content/english/writing/deploy-your-api-from-a-jenkins-pipeline.md diff --git a/content/writing/full-api-lifecycle-management-a-primer.md b/content/english/writing/full-api-lifecycle-management-a-primer.md similarity index 100% rename from content/writing/full-api-lifecycle-management-a-primer.md rename to content/english/writing/full-api-lifecycle-management-a-primer.md diff --git a/content/writing/manage-your-apis-deployed-with-istio-service-mesh.md b/content/english/writing/manage-your-apis-deployed-with-istio-service-mesh.md similarity index 100% rename from content/writing/manage-your-apis-deployed-with-istio-service-mesh.md rename to content/english/writing/manage-your-apis-deployed-with-istio-service-mesh.md diff --git a/content/writing/red-hat-single-sign-on-give-it-a-try-for-no-cost.md b/content/english/writing/red-hat-single-sign-on-give-it-a-try-for-no-cost.md similarity index 100% rename from content/writing/red-hat-single-sign-on-give-it-a-try-for-no-cost.md rename to content/english/writing/red-hat-single-sign-on-give-it-a-try-for-no-cost.md diff --git a/content/writing/using-a-public-certificate-with-red-hat-single-sign-on-keycloak.md b/content/english/writing/using-a-public-certificate-with-red-hat-single-sign-on-keycloak.md similarity index 100% rename from content/writing/using-a-public-certificate-with-red-hat-single-sign-on-keycloak.md rename to content/english/writing/using-a-public-certificate-with-red-hat-single-sign-on-keycloak.md diff --git a/content/writing/using-the-3scale-toolbox-jenkins-shared-library.md b/content/english/writing/using-the-3scale-toolbox-jenkins-shared-library.md similarity index 100% rename from content/writing/using-the-3scale-toolbox-jenkins-shared-library.md rename to content/english/writing/using-the-3scale-toolbox-jenkins-shared-library.md diff --git a/content/french/_index.md b/content/french/_index.md new file mode 100644 index 0000000..d527097 --- /dev/null +++ b/content/french/_index.md @@ -0,0 +1,11 @@ +--- +title: "Nicolas Massé" +--- + +Je suis Nicolas Massé, vous me trouverez sur les réseaux sociaux sous le pseudo "nmasse-itix". +Développeur de formation, mon métier actuel est consultant avant-vente dans les domaines de l'[API Management]({{}}), le [Single Sign On]({{}}) et les [conteneurs]({{}}). + +Je travaille principalement avec des technologies [Open Source]({{}}) telles que [Keycloak]({{}}), [3scale]({{}}) ou [OpenShift]({{}}). +Je partage mon [expertise]({{}}) et mes centres d'intérêt sur ce site, [ailleurs sur le web]({{}}) et je donne occasionnellement des [conférences]({{}}). + +Je vous invite à lire [mon blog]({{}}) ou à en savoir plus [sur moi](https://www.linkedin.com/in/nicolasmasse/). diff --git a/content/french/contact/index.md b/content/french/contact/index.md new file mode 100644 index 0000000..504b361 --- /dev/null +++ b/content/french/contact/index.md @@ -0,0 +1,15 @@ +--- +title: "Me contacter" +--- + +Besoin de quelque chose ? + +Pour toute demande de conférence, d'article ou de prestation, vous pouvez me contacter directement à mon adresse e-mail ou sur Twitter à [@nmasse_itix](https://twitter.com/nmasse_itix). + +![Mon e-mail](/images/my-email.png) + +Si vous souhaitez en savoir plus sur mon parcours professionnel, vous pouvez le trouver sur [Linkedin](https://www.linkedin.com/in/nicolasmasse/) mais je peux également fournir un CV ou une biographie à jour sur demande. + +Si vous me contactez pour l'un de mes [projets Open Source](https://github.com/nmasse-itix?tab=repositories) ou l'une de mes contributions, vous pouvez ouvrir un ticket dans l'entrepot GitHub concerné et mentionnez [@nmasse-itix](https://github.com/nmasse-itix/). + +Remarque: je ne m'engage généralement pas sur un temps de réponse spécifique ni sur aucune réponse du tout à moins que votre e-mail ne soit clair, droit au but et ait quelque chose à voir avec mes centres d'intérêt. diff --git a/content/french/opensource/_index.md b/content/french/opensource/_index.md new file mode 100644 index 0000000..c7314f2 --- /dev/null +++ b/content/french/opensource/_index.md @@ -0,0 +1,6 @@ +--- +title: "Open Source" +--- + +J'utilise dans mon travail au quotidien de nombreuses communautés Open Source, sur lesquelles j'ai été ammené à écrire des articles. +Chaque communauté Open Source ci-dessous est un lien vers la liste des articles correspondants. diff --git a/content/french/speaking/_index.md b/content/french/speaking/_index.md new file mode 100644 index 0000000..39ed961 --- /dev/null +++ b/content/french/speaking/_index.md @@ -0,0 +1,6 @@ +--- +title: "Conférences" +--- + +Je suis occasionnellement invité chez des clients ou sur des salons pour parler des APIs et de SSO. +J'ai compilé ci-dessous la liste de mes dernières interventions. diff --git a/content/french/topics/_index.md b/content/french/topics/_index.md new file mode 100644 index 0000000..9842dcf --- /dev/null +++ b/content/french/topics/_index.md @@ -0,0 +1,6 @@ +--- +title: "Expertise" +--- + +Au cours de mes différentes prestations, je suis amené à travailler sur des sujets variés pour lesquels j'ai écrit un ou plusieurs articles. +Chaque sujet est un lien vers la liste des articles correspondants. diff --git a/content/french/writing/_index.md b/content/french/writing/_index.md new file mode 100644 index 0000000..0d7791f --- /dev/null +++ b/content/french/writing/_index.md @@ -0,0 +1,7 @@ +--- +title: "Publications" +date: 2019-11-07T00:00:00+02:00 +draft: false +--- + +Je publie des articles de temps à autre sur divers sites web en tant qu'invité. J'ai compilé ci-dessous une liste de mes récentes publications. diff --git a/content/speaking/_index.md b/content/speaking/_index.md deleted file mode 100644 index 61beb20..0000000 --- a/content/speaking/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Speaking" -date: 2017-02-20T00:00:00+02:00 -draft: false ---- - -Here is a list of my recent talks. \ No newline at end of file diff --git a/content/writing/_index.md b/content/writing/_index.md deleted file mode 100644 index c1b1f07..0000000 --- a/content/writing/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Writing" -date: 2019-11-07T00:00:00+02:00 -draft: false ---- - -Here is a list of my recent articles. From 65970aead27e0539e7da9759d76055361aca57d2 Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 17:19:44 +0100 Subject: [PATCH 03/15] build script --- hugo | 25 +++++++++++++++++++++++++ netlify.toml | 4 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100755 hugo diff --git a/hugo b/hugo new file mode 100755 index 0000000..7d7c293 --- /dev/null +++ b/hugo @@ -0,0 +1,25 @@ +#!/bin/sh + +set -Eeuo pipefail +trap cleanup SIGINT SIGTERM ERR EXIT + +function cleanup() { + trap - SIGINT SIGTERM ERR EXIT + + find content/french -type l -print0 | while IFS= read -r -d $'\0' filename; do + if realpath "$filename" | grep -E "^$PWD/" > /dev/null; then + rm -f "$filename" + fi + done +} + +(cd content/english && find * -type f -name '*.md') | while read file; do + if [ ! -e "content/french/$file" ]; then + ln -s ../../../content/english/$file content/french/$file + fi +done + +find content/french -xtype l -exec rm -f {} \; + +hugo gen chromastyles --style=borland > static/css/chroma.css +hugo "$@" diff --git a/netlify.toml b/netlify.toml index 71e366e..4d77cc5 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,6 +1,6 @@ [build] publish = "public" -command = "hugo gen chromastyles --style=perldoc > static/css/chroma.css && hugo" +command = "./hugo" [build.environment] # Global HUGO_VERSION = "0.42" @@ -9,7 +9,7 @@ HUGO_VERSION = "0.42" HUGO_VERSION = "0.42" [context.deploy-preview] -command = "hugo gen chromastyles --style=perldoc > static/css/chroma.css && hugo --buildDrafts --buildFuture --baseURL $DEPLOY_PRIME_URL" +command = "./hugo --buildDrafts --buildFuture --baseURL $DEPLOY_PRIME_URL" [context.deploy-preview.environment] HUGO_ENABLEGITINFO = "true" From 16726d13b5f879051eb1a2054f64a7fc15c70077 Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 17:20:21 +0100 Subject: [PATCH 04/15] new shortcodes --- layouts/shortcodes/attachedFigure.html | 11 +++++++++++ layouts/shortcodes/figure.html | 10 ++++++++++ 2 files changed, 21 insertions(+) create mode 100644 layouts/shortcodes/attachedFigure.html create mode 100644 layouts/shortcodes/figure.html diff --git a/layouts/shortcodes/attachedFigure.html b/layouts/shortcodes/attachedFigure.html new file mode 100644 index 0000000..a02f8fa --- /dev/null +++ b/layouts/shortcodes/attachedFigure.html @@ -0,0 +1,11 @@ + +{{ $filename := .Get "src" }} +{{ $image := .Page.Resources.GetMatch (printf "%s" $filename) }} +
+ + {{ with .Get "title" }} +
+ {{ . }} +
+ {{ end }} +
\ No newline at end of file diff --git a/layouts/shortcodes/figure.html b/layouts/shortcodes/figure.html new file mode 100644 index 0000000..8c2ea6d --- /dev/null +++ b/layouts/shortcodes/figure.html @@ -0,0 +1,10 @@ + +{{ $url := .Get "src" }} +
+ + {{ with .Get "title" }} +
+ {{ . }} +
+ {{ end }} +
\ No newline at end of file From f0e8a0ba8544f6d4201132f667f05257b51e8a28 Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 17:20:38 +0100 Subject: [PATCH 05/15] new archetype --- archetypes/default.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 archetypes/default.md diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..0e07e13 --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,15 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +description: "" +opensource: +- project1 +topics: +- topic1 +--- + +Headline. + + + +Main content here. From 7649f999f65224916be14686d8011ee420025fde Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 17:21:40 +0100 Subject: [PATCH 06/15] cleanup --- .gitignore | 2 ++ static/google194fb24cd268043f.html | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 static/google194fb24cd268043f.html diff --git a/.gitignore b/.gitignore index a7cea66..2981c53 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ public .DS_Store +resources + diff --git a/static/google194fb24cd268043f.html b/static/google194fb24cd268043f.html deleted file mode 100644 index d17eeba..0000000 --- a/static/google194fb24cd268043f.html +++ /dev/null @@ -1 +0,0 @@ -google-site-verification: google194fb24cd268043f.html \ No newline at end of file From 31a245ab3fefaf44a0270bd0b24fd84398192bfb Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 17:26:05 +0100 Subject: [PATCH 07/15] switch to the itix theme --- .gitmodules | 3 +++ config.yaml | 2 +- themes/itix | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) create mode 160000 themes/itix diff --git a/.gitmodules b/.gitmodules index e69de29..aad5512 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "themes/itix"] + path = themes/itix + url = https://github.com/nmasse-itix/hugo-theme-itix.git diff --git a/config.yaml b/config.yaml index ed1537c..a6f4730 100644 --- a/config.yaml +++ b/config.yaml @@ -1,7 +1,7 @@ baseURL: "/" title: "Nicolas Massé" author: "Nicolas Massé" -theme: "diary" +theme: "itix" # pygmentsUseClasses implies a style sheet that can be generated as follow: # hugo gen chromastyles --style=borland > static/css/chroma.css pygmentsUseClasses: true diff --git a/themes/itix b/themes/itix new file mode 160000 index 0000000..080cd3f --- /dev/null +++ b/themes/itix @@ -0,0 +1 @@ +Subproject commit 080cd3f1d8109395648458fe6b47f7e217a9b0b3 From 5e633e8e5dd9b06bbf0c8ee714bb150a4415bdc8 Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 17:32:38 +0100 Subject: [PATCH 08/15] remove leftover from a previous test --- content/english/blog/jmeter-assess-software-performances.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/english/blog/jmeter-assess-software-performances.md b/content/english/blog/jmeter-assess-software-performances.md index da0d9fa..d3b52d1 100644 --- a/content/english/blog/jmeter-assess-software-performances.md +++ b/content/english/blog/jmeter-assess-software-performances.md @@ -19,7 +19,6 @@ To keep this article short and readable, I focused on the assessment of two HTTP ## Hardware setup -### Test 1 When building my lab, I chose the smallest computer I had at home to host the thing to be assessed. The reason is: the more powerful is the server, the more steady needs the network setup to be, the more powerful the injector needs to be. If the rest of your setup is not up to the task, you are measuring something that is not the performances of the thing but rather the performances of your network or the injector itself! @@ -28,7 +27,7 @@ We will see a good demonstration of this in the rest of the article. So, the target hardware is an ARMv5 board with only one core running at 1.2 GHz, 128 MB of RAM and 256 MB of Flash. It was [a cheap NAS device](https://www.cnet.com/reviews/seagate-goflex-home-network-storage-system-review/) in its previous life. I installed [OpenWRT](/opensource/openwrt/) on this little device. -### Test 2 + The injector is hosted on my Macbook Pro, a Core i7 at 2.5 GHz. This will provide a comfortable margin before reaching the limits of the injector. From 2414ed7ceaa09318ed01b950f08c7b62b4ffbcad Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 21:52:14 +0100 Subject: [PATCH 09/15] fix summaries --- content/english/blog/3scale-toolbox-anonymous-policy.md | 2 ++ content/english/blog/3scale-toolbox-url-rewriting-policy.md | 2 ++ content/english/blog/ansible-add-prefix-suffix-to-list.md | 2 ++ content/english/blog/check-ansible-version-number-playbook.md | 2 ++ content/english/blog/cleanup-playbook-3scale.md | 2 ++ content/english/blog/cli-world-clock.md | 2 ++ content/english/blog/configure-redhat-sso-3scale-cli.md | 2 ++ content/english/blog/configure-truststore-apicurio-studio.md | 2 ++ content/english/blog/deploying-invidious-openshift.md | 2 ++ content/english/blog/deploying-miniflux-openshift.md | 2 ++ content/english/blog/enable-global-policies-apicast.md | 3 +++ content/english/blog/feed-url-drupal-wordpress-wix-youtube.md | 2 ++ content/english/blog/install-miniflux-raspberry-pi.md | 2 ++ content/english/blog/install-openwrt-raspberry-pi.md | 2 ++ content/english/blog/install-operator-openshift-cli.md | 2 ++ content/english/blog/is-my-ntp-daemon-working.md | 2 ++ content/english/blog/jmeter-assess-software-performances.md | 2 ++ content/english/blog/nginx-with-tls-on-openwrt.md | 2 ++ content/english/blog/print-config-file-without-comments.md | 2 ++ content/english/blog/running-redhat-sso-outside-openshift.md | 2 ++ .../blog/secure-openshift-4-openid-connect-authentication.md | 2 ++ content/english/blog/secure-quarkus-api-with-keycloak.md | 2 ++ .../english/blog/secure-raspberry-pi-keycloak-gatekeeper.md | 2 ++ content/english/blog/send-mails-openwrt-msmtp-gmail.md | 3 +++ content/english/blog/testing-hard-drive-ssd-performance.md | 2 ++ ...use-ansible-to-manage-the-qos-of-your-openshift-workload.md | 2 ++ .../english/blog/use-google-account-openid-connect-provider.md | 2 ++ content/english/blog/use-qlkube-to-query-the-kubernetes-api.md | 2 ++ ...writing-workshop-instructions-with-hugo-deploy-openshift.md | 2 ++ .../blog/writing-workshop-instructions-with-hugo-variables.md | 2 ++ .../english/blog/writing-workshop-instructions-with-hugo.md | 2 ++ 31 files changed, 64 insertions(+) diff --git a/content/english/blog/3scale-toolbox-anonymous-policy.md b/content/english/blog/3scale-toolbox-anonymous-policy.md index 257fe15..3a7e7eb 100644 --- a/content/english/blog/3scale-toolbox-anonymous-policy.md +++ b/content/english/blog/3scale-toolbox-anonymous-policy.md @@ -12,6 +12,8 @@ If you tried this approach by yourself you may end up, *sooner or later*, with a What is this policy and why is it there? Let's dig in! + + In a nutshell, the *Anonymous* policy instruct the *APIcast* gateway to expose an API **without any security mechanism**. Given how we stress out the importance of security in our very fragile IT systems, this calls out the following question: why was it there in the first place? diff --git a/content/english/blog/3scale-toolbox-url-rewriting-policy.md b/content/english/blog/3scale-toolbox-url-rewriting-policy.md index 30165bf..b219b42 100644 --- a/content/english/blog/3scale-toolbox-url-rewriting-policy.md +++ b/content/english/blog/3scale-toolbox-url-rewriting-policy.md @@ -10,6 +10,8 @@ topics: In this article on the Red Hat Developer blog, I explained [how to deploy an API from a Jenkins Pipeline, using the 3scale toolbox](https://developers.redhat.com/blog/2019/07/30/deploy-your-api-from-a-jenkins-pipeline/). If you tried this approach by yourself you may have noticed that in some cases, the configured service includes the *URL Rewriting* policy in its *Policy Chain*. + + The *URL Rewriting* policy can be used for a variety of use cases but, in a nutshell, the *URL Rewriting* policy is used by the toolbox to change the *Base Path* of an API. For instance, if your actual API implementation is live at **/camel/my-route** but you wish to expose it on **/api/v1**, you can instruct the 3scale toolbox to configure the *URL Rewriting* policy for you by specifying the `--override-private-basepath` and `--override-public-basepath` options. diff --git a/content/english/blog/ansible-add-prefix-suffix-to-list.md b/content/english/blog/ansible-add-prefix-suffix-to-list.md index 24aa6ff..8e3e6cb 100644 --- a/content/english/blog/ansible-add-prefix-suffix-to-list.md +++ b/content/english/blog/ansible-add-prefix-suffix-to-list.md @@ -9,6 +9,8 @@ topics: Recently, in [one of my Ansible playbooks](../airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments) I had to prefix all items of a list with a chosen string. + + Namely, from the following list: ```python diff --git a/content/english/blog/check-ansible-version-number-playbook.md b/content/english/blog/check-ansible-version-number-playbook.md index 395f617..e557447 100644 --- a/content/english/blog/check-ansible-version-number-playbook.md +++ b/content/english/blog/check-ansible-version-number-playbook.md @@ -11,6 +11,8 @@ My Ansible playbooks sometimes use features that are available only in a very re To prevent unecessary troubles to the team mates that will execute them, I like to add a task at the very beginning of my playbooks to check the Ansible version number and abort if the requirements are not met. + + ```yaml - name: Verify that Ansible version is >= 2.4.6 assert: diff --git a/content/english/blog/cleanup-playbook-3scale.md b/content/english/blog/cleanup-playbook-3scale.md index cc10cd1..a1a4682 100644 --- a/content/english/blog/cleanup-playbook-3scale.md +++ b/content/english/blog/cleanup-playbook-3scale.md @@ -14,6 +14,8 @@ And with the new feature named *API-as-a-Product*, there are now **Backends and This article explains how to cleanup a 3scale tenant using Ansible. + + ## Pre-requisites Make sure Ansible is installed locally and is a fairly recent version. diff --git a/content/english/blog/cli-world-clock.md b/content/english/blog/cli-world-clock.md index f448d85..e633e3c 100644 --- a/content/english/blog/cli-world-clock.md +++ b/content/english/blog/cli-world-clock.md @@ -10,6 +10,8 @@ requires me to leave my terminal. Let's meet the CLI World clock! + + ```sh function t() { for tz in Europe/Paris Europe/Dublin US/Eastern US/Central US/Pacific; do diff --git a/content/english/blog/configure-redhat-sso-3scale-cli.md b/content/english/blog/configure-redhat-sso-3scale-cli.md index ffef4e2..721b5b1 100644 --- a/content/english/blog/configure-redhat-sso-3scale-cli.md +++ b/content/english/blog/configure-redhat-sso-3scale-cli.md @@ -12,6 +12,8 @@ topics: The [official documentation](https://access.redhat.com/documentation/en-us/red_hat_3scale_api_management/2.8/html/administering_the_api_gateway/openid-connect#configure_red_hat_single_sign_on) describes the steps to configure Red Hat SSO / Keycloak but it uses the Graphical User Interface, which can be tedious if you have multiple environments to configure. Let's configure Red Hat SSO for 3scale using the CLI! + + As a pre-requisite, install [jq](https://stedolan.github.io/jq/download/). Fetch the hostname, login and password of your Red Hat SSO instance, from your OpenShift environment. diff --git a/content/english/blog/configure-truststore-apicurio-studio.md b/content/english/blog/configure-truststore-apicurio-studio.md index 547ce81..5f9d945 100644 --- a/content/english/blog/configure-truststore-apicurio-studio.md +++ b/content/english/blog/configure-truststore-apicurio-studio.md @@ -13,6 +13,8 @@ topics: Unfortunately, sometimes TLS certificates can get in the way of proper communication between the two projects. This post explains how to configure the trust store in Apicurio to overcome TLS communication issues between Apicurio and Microcks. + + Start by gathering the CA certificates used in your company. There can be several ones. You can then create a trust store by running this command for each CA certificate to import: diff --git a/content/english/blog/deploying-invidious-openshift.md b/content/english/blog/deploying-invidious-openshift.md index 077e345..09c002c 100644 --- a/content/english/blog/deploying-invidious-openshift.md +++ b/content/english/blog/deploying-invidious-openshift.md @@ -12,6 +12,8 @@ topics: There is a hosted instance at [invidio.us](https://invidio.us/) if you want to give it a try. But, wouldn't it be cooler to host your own instance on your OpenShift cluster? Let's do it! + + Create a new project. ```sh diff --git a/content/english/blog/deploying-miniflux-openshift.md b/content/english/blog/deploying-miniflux-openshift.md index 017ed8c..6883c10 100644 --- a/content/english/blog/deploying-miniflux-openshift.md +++ b/content/english/blog/deploying-miniflux-openshift.md @@ -10,6 +10,8 @@ topics: [Miniflux](https://miniflux.app) is a minimalist, open source and opinionated RSS feed reader. There is a [hosted instance](https://miniflux.app/hosting.html) available at a fair price point but wouldn't it be cooler to host your own instance on your OpenShift cluster? Let's do it! + + Create a new project. ```sh diff --git a/content/english/blog/enable-global-policies-apicast.md b/content/english/blog/enable-global-policies-apicast.md index 21d534b..9615498 100644 --- a/content/english/blog/enable-global-policies-apicast.md +++ b/content/english/blog/enable-global-policies-apicast.md @@ -12,6 +12,9 @@ This is very powerful since each service receives its specific configuration. However, if the same treatment has to be applied to every service exposed, it becomes an administration overhead. Hopefully, Apicast has the concept of *Global Policies* that applies to every service exposed by itself. + + + An example of a widespread policy, especially during demos, is the CORS policy to allow the API Developer Portal to query the API Gateway directly. To configure the *Global Policy Chain*, you will have to provide a custom *Environment file*. diff --git a/content/english/blog/feed-url-drupal-wordpress-wix-youtube.md b/content/english/blog/feed-url-drupal-wordpress-wix-youtube.md index 88c9c24..9c19ab8 100644 --- a/content/english/blog/feed-url-drupal-wordpress-wix-youtube.md +++ b/content/english/blog/feed-url-drupal-wordpress-wix-youtube.md @@ -7,6 +7,8 @@ If like me you are using [an RSS reader](../deploying-miniflux-openshift/) to st But since most website are based on commonly found CMS, it is highly probable the RSS feeds are there, just not advertised. + + Here are the URL patterns for the most common CMS on the market: - **Wordpress**: `/feed/` or `/?feed=rss2` diff --git a/content/english/blog/install-miniflux-raspberry-pi.md b/content/english/blog/install-miniflux-raspberry-pi.md index 50d57a0..7912ad6 100644 --- a/content/english/blog/install-miniflux-raspberry-pi.md +++ b/content/english/blog/install-miniflux-raspberry-pi.md @@ -11,6 +11,8 @@ In the article "[Nginx with TLS on OpenWRT](../nginx-with-tls-on-openwrt/)", I e But without an application to protect, Nginx is quite useless. This article explains how to install [Miniflux](https://miniflux.app/) (a lightweight RSS reader) on your Raspberry PI and how to host it as an Nginx virtual host. + + Miniflux is a web application written in Go and backed by a PostgreSQL database. So we will need to install PostgreSQL, install miniflux and setup Nginx. The rest of this article assumes you [installed OpenWRT on your Raspberry](../install-openwrt-raspberry-pi/), but it should be applicable to any Linux distribution with minimal changes. ## Install PostgreSQL diff --git a/content/english/blog/install-openwrt-raspberry-pi.md b/content/english/blog/install-openwrt-raspberry-pi.md index 0824f16..a64270c 100644 --- a/content/english/blog/install-openwrt-raspberry-pi.md +++ b/content/english/blog/install-openwrt-raspberry-pi.md @@ -11,6 +11,8 @@ topics: It made design choices that take it apart from the usual Linux distributions: musl libc instead of the usual glibc, busybox instead of coreutils, ash instead of bash, etc. As a result, the system is very light and blazing fast! + + Continue reading to know how to **install OpenWRT on your Raspberry PI**. ## Install OpenWRT diff --git a/content/english/blog/install-operator-openshift-cli.md b/content/english/blog/install-operator-openshift-cli.md index a90b254..197c14d 100644 --- a/content/english/blog/install-operator-openshift-cli.md +++ b/content/english/blog/install-operator-openshift-cli.md @@ -15,6 +15,8 @@ Most software now provide an operator and describe how to use it. Nevertheless, almost every software documentation I read so far, includes the steps to install the operator using the nice GUI of OpenShift 4. But since my OpenShift environments are provisioned by a playbook, I want to be able to install operators using the CLI only! + + The [OpenShift official documentation](https://docs.openshift.com/container-platform/4.3/operators/olm-adding-operators-to-cluster.html#olm-installing-operator-from-operatorhub-using-cli_olm-adding-operators-to-a-cluster) covers this part but I did not find it very clear. So, this article tries to make it clearer: **how to install Kubernetes operators in OpenShift using only the CLI**. diff --git a/content/english/blog/is-my-ntp-daemon-working.md b/content/english/blog/is-my-ntp-daemon-working.md index 9651bb0..b4b7884 100644 --- a/content/english/blog/is-my-ntp-daemon-working.md +++ b/content/english/blog/is-my-ntp-daemon-working.md @@ -17,6 +17,8 @@ This can happen when your [NTP](https://en.wikipedia.org/wiki/Network_Time_Proto daemon is not synchronized. This means it cannot reliably determine the current time. + + First, make sure your NTP daemon is started: ```raw diff --git a/content/english/blog/jmeter-assess-software-performances.md b/content/english/blog/jmeter-assess-software-performances.md index d3b52d1..d7cc5b7 100644 --- a/content/english/blog/jmeter-assess-software-performances.md +++ b/content/english/blog/jmeter-assess-software-performances.md @@ -14,6 +14,8 @@ I could have jumped into the code and changed something, hoping it will improve But that would be ineffective and unprofessional. So, I decided to have an honest measure of the current performances as well as a reproducible setup to have consistent measures over time. + + This article explains how I built my performance testing lab using [JMeter](https://jmeter.apache.org/index.html) and an old ARM board. To keep this article short and readable, I focused on the assessment of two HTTP libraries (golang's net/http and valyala's fasthttp), leaving the discussion about the Telegram Photo Bot performances for a next article. diff --git a/content/english/blog/nginx-with-tls-on-openwrt.md b/content/english/blog/nginx-with-tls-on-openwrt.md index 637d645..ed2b1f9 100644 --- a/content/english/blog/nginx-with-tls-on-openwrt.md +++ b/content/english/blog/nginx-with-tls-on-openwrt.md @@ -11,6 +11,8 @@ topics: In the article "[Install OpenWRT on your Raspberry PI](../install-openwrt-raspberry-pi/)", I explained how to install OpenWRT on a Raspberry PI and the first steps as an OpenWRT user. As I plan to use my Raspberry PI to host plenty of web applications, I wanted to setup a versatile reverse proxy to protect them all, along with TLS support to meet nowadays security requirements. + + OpenWRT has an [nginx package](https://openwrt.org/packages/pkgdata/nginx), ready to be installed using *opkg* but unfortunately it does not have TLS enabled. So we need to recompile nginx with TLS enabled! ## Install the OpenWRT SDK diff --git a/content/english/blog/print-config-file-without-comments.md b/content/english/blog/print-config-file-without-comments.md index 609a8a3..42b47f7 100644 --- a/content/english/blog/print-config-file-without-comments.md +++ b/content/english/blog/print-config-file-without-comments.md @@ -9,6 +9,8 @@ Sounds familiar? Not that comments are useless in a configuration file but sometimes it's handy to print a configuration file without the comment lines. Especially when the file is thousand lines long but the useful lines fit the twenty five lines of a standard terminal. + + The `egrep` command which is standard on most Linux distributions and on MacOS, can strip out the unwanted lines: ```sh diff --git a/content/english/blog/running-redhat-sso-outside-openshift.md b/content/english/blog/running-redhat-sso-outside-openshift.md index 568a88c..cbefa9b 100644 --- a/content/english/blog/running-redhat-sso-outside-openshift.md +++ b/content/english/blog/running-redhat-sso-outside-openshift.md @@ -11,6 +11,8 @@ In an article named [Red Hat Single Sign-On: Give it a try for no cost!](https:/ As pointed by a reader in a comment, as widespread OpenShift can be, not everyone has access to a running OpenShift cluster. So, here is how to run Red Hat SSO outside of OpenShift: using only plain Docker commands. + + The rest of this procedure assumes you already have a token to access the Red Hat registry (full procedure described in [my article](https://developers.redhat.com/blog/2019/02/07/red-hat-single-sign-on-give-it-a-try-for-no-cost/) and in the [Red Hat SSO Getting Started guide, chapter 3, section 3.1](https://access.redhat.com/documentation/en-us/red_hat_single_sign-on/7.3/html/red_hat_single_sign-on_for_openshift/get_started)). Start by logging in with this token using the *docker login* command (do not forget to replace the login and password with yours): diff --git a/content/english/blog/secure-openshift-4-openid-connect-authentication.md b/content/english/blog/secure-openshift-4-openid-connect-authentication.md index f05a4d6..014c4da 100644 --- a/content/english/blog/secure-openshift-4-openid-connect-authentication.md +++ b/content/english/blog/secure-openshift-4-openid-connect-authentication.md @@ -14,6 +14,8 @@ But this is yet another password to remember! OpenShift can handle the [OpenID Connect](https://openid.net/connect/) protocol and thus offers Single Sign On to its users. No additional password to remember: you can login to the OpenShift console with your [Google Account](../use-google-account-openid-connect-provider) for instance. + + ## Pre-requisites The rest of this article assumes you have already setup your OpenID Connect client in the Google Developer Console as explained in this article: [Use your Google Account as an OpenID Connect provider](../use-google-account-openid-connect-provider). diff --git a/content/english/blog/secure-quarkus-api-with-keycloak.md b/content/english/blog/secure-quarkus-api-with-keycloak.md index 3c5dac8..d8d246e 100644 --- a/content/english/blog/secure-quarkus-api-with-keycloak.md +++ b/content/english/blog/secure-quarkus-api-with-keycloak.md @@ -14,6 +14,8 @@ Quarkus can be used for any type of backend development, including API-enabled b In this article, I'm describing how to secure a Quarkus API with Keycloak using JWT tokens. + + ## Preparation As a pre-requisite, install [Maven](https://maven.apache.org/), [jq](https://stedolan.github.io/jq/download/) and [jwt-cli](https://github.com/mike-engel/jwt-cli#installation). diff --git a/content/english/blog/secure-raspberry-pi-keycloak-gatekeeper.md b/content/english/blog/secure-raspberry-pi-keycloak-gatekeeper.md index dc46910..91beaa4 100644 --- a/content/english/blog/secure-raspberry-pi-keycloak-gatekeeper.md +++ b/content/english/blog/secure-raspberry-pi-keycloak-gatekeeper.md @@ -13,6 +13,8 @@ Some of the web applications that I installed on my Raspberry PI do not feature No authentication means that anybody on the internet could reach those applications and play with them. This article explains how to secure applications running on a Raspberry PI with [Keycloak Gatekeeper](https://github.com/keycloak/keycloak-gatekeeper). + + [Keycloak Gatekeeper](https://github.com/keycloak/keycloak-gatekeeper) is a reverse proxy whose sole purpose is to authenticate the end-users using the [OpenID Connect](https://openid.net/connect/) protocol. If Keycloak Gatekeeper is best used in conjunction with the [Keycloak Identity Provider](https://www.keycloak.org/), it can also be used with any Identity Provider that conforms to the OpenID Connect specifications. diff --git a/content/english/blog/send-mails-openwrt-msmtp-gmail.md b/content/english/blog/send-mails-openwrt-msmtp-gmail.md index 6c55341..ea4552e 100644 --- a/content/english/blog/send-mails-openwrt-msmtp-gmail.md +++ b/content/english/blog/send-mails-openwrt-msmtp-gmail.md @@ -13,6 +13,9 @@ With great power comes great responsibilities. So, you might want to be notified when something goes wrong, a cron job failed, a hard disk is dying, etc., so that you can fix the problem at earliest, maybe before anyone else could notice. This article explains how to send mails on OpenWRT with MSMTP and a GMail account. + + + You can adapt this procedure to any email provider that supports SMTP access with a login and password. ## Configure GMail diff --git a/content/english/blog/testing-hard-drive-ssd-performance.md b/content/english/blog/testing-hard-drive-ssd-performance.md index 980f5f9..567dee4 100644 --- a/content/english/blog/testing-hard-drive-ssd-performance.md +++ b/content/english/blog/testing-hard-drive-ssd-performance.md @@ -9,6 +9,8 @@ If your Linux system appears to be slow, it might be an issue with your disks, either hard drive or SSD. Hopefully, with a few commands you can get an idea of the performances of your disks. + + First, you will have to install `hdparm` using `yum` or `dnf`: ```sh diff --git a/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md b/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md index 2dcbf91..684ee0b 100644 --- a/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md +++ b/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md @@ -12,6 +12,8 @@ As I was administering my OpenShift cluster, I found out that I had a too much memory requests. To preserve a good quality of service on my cluster, I had to tacle this issue. + + Resource requests and limits in OpenShift (and Kubernetes in general) are the concepts that helps define the quality of service of every running Pod. diff --git a/content/english/blog/use-google-account-openid-connect-provider.md b/content/english/blog/use-google-account-openid-connect-provider.md index 297d869..efb31c7 100644 --- a/content/english/blog/use-google-account-openid-connect-provider.md +++ b/content/english/blog/use-google-account-openid-connect-provider.md @@ -10,6 +10,8 @@ Unless you have a password vault to store your credentials securely, it is very This article goes through all the steps to use your Google Account as an [OpenID Connect](https://openid.net/connect/) provider and subsequent articles (check links at the bottom of this article) explain how to configure the different services and software to use your Google Account as an OpenID Connect provider. + + The article is divided in three parts. * a general overview of OpenID Connect protocol diff --git a/content/english/blog/use-qlkube-to-query-the-kubernetes-api.md b/content/english/blog/use-qlkube-to-query-the-kubernetes-api.md index ff1ed66..29f54cb 100644 --- a/content/english/blog/use-qlkube-to-query-the-kubernetes-api.md +++ b/content/english/blog/use-qlkube-to-query-the-kubernetes-api.md @@ -12,6 +12,8 @@ topics: It strives to reduce the chattiness clients can experience when querying REST APIs. It is very useful for mobile application and web development: by reducing the number of roundtrips needed to fetch the relevant data and by fetching only the needed field, the network usage is greatly reduced. + + To install QLKube in OpenShift, use the NodeJS Source-to-Image builder: {{< highlight sh >}} diff --git a/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md index f499784..b8086b9 100644 --- a/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md +++ b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md @@ -9,6 +9,8 @@ opensource: This is the third part of my series covering how to [Write workshop instructions with Hugo](../writing-workshop-instructions-with-hugo/). In this article, we will deploy our [Hugo mini-training](https://github.com/nmasse-itix/hugo-workshop/) as a container in OpenShift. + + Since Hugo is a static website generator, we only need a web server in our container to serve those pages. Let's settle for nginx that is [neatly packaged as a container image, as part of the Software Collections](https://www.softwarecollections.org/en/scls/rhscl/rh-nginx114/). And to build our final container image that will contain both our website (the static pages to serve) and the web server itself, we will use the [Source-to-image (S2I)](https://github.com/openshift/source-to-image) tool. Hopefully, the nginx image of the Software Collections is already S2I enabled! diff --git a/content/english/blog/writing-workshop-instructions-with-hugo-variables.md b/content/english/blog/writing-workshop-instructions-with-hugo-variables.md index 13972e0..c6bd9f5 100644 --- a/content/english/blog/writing-workshop-instructions-with-hugo-variables.md +++ b/content/english/blog/writing-workshop-instructions-with-hugo-variables.md @@ -16,6 +16,8 @@ In the first part, we saw how to: For this second part, we will add variables to our content so that we can easily adjust the workshop instructions to different use cases. + + One of the most common usage we have for variables is to deliver the same workshop on different environments. This means URLs, username and passwords change and we need to adjust our workshop instructions very quicky to match the new environment. diff --git a/content/english/blog/writing-workshop-instructions-with-hugo.md b/content/english/blog/writing-workshop-instructions-with-hugo.md index a73055c..88f6748 100644 --- a/content/english/blog/writing-workshop-instructions-with-hugo.md +++ b/content/english/blog/writing-workshop-instructions-with-hugo.md @@ -29,6 +29,8 @@ but is difficult to work with for the participants. Hopefully [Hugo](https://gohugo.io/) can help us! + + As an example, in the rest of this article, we will craft a mini-training about Hugo! From cdb2a843fa29d046813d49dc9eed523113d99ed8 Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 21:52:30 +0100 Subject: [PATCH 10/15] useless file --- static/images/qrcode.png | Bin 19998 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 static/images/qrcode.png diff --git a/static/images/qrcode.png b/static/images/qrcode.png deleted file mode 100644 index f280617a54730e831f0189a974ae0835161a94a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19998 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 A1^@s6 From 2a03c0f717f6a0f446a5a7ae78acbe49fddc682a Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 21:53:04 +0100 Subject: [PATCH 11/15] update theme --- themes/itix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/itix b/themes/itix index 080cd3f..10a2f31 160000 --- a/themes/itix +++ b/themes/itix @@ -1 +1 @@ -Subproject commit 080cd3f1d8109395648458fe6b47f7e217a9b0b3 +Subproject commit 10a2f3146b8bd329c7c5cb2b934e8931c184a80a From 4199b2e8507062c27ca5ec51646345f74a3faffc Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 23:21:18 +0100 Subject: [PATCH 12/15] switch to page bundles for attachments --- archetypes/default.md | 3 ++ .../index.md} | 4 ++- .../pull.yaml | 0 .../blog/cleanup-playbook-3scale/cleanup.yaml | 0 .../index.md} | 4 ++- .../index.md} | 4 ++- .../openid-connect-issuer.png | Bin .../index.md} | 4 ++- .../uart-pins.jpeg | Bin .../control1.png | Bin .../control2.png | Bin .../control3.png | Bin .../if.png | Bin .../index.md} | 14 ++++----- .../thread-group.png | Bin .../udv.png | Bin .../index.md} | 4 ++- .../make-menuconfig.png | Bin .../change-qos.yaml | 0 .../index.md} | 4 ++- .../auth-ok.png | Bin .../auth.png | Bin .../authorized-domains.png | Bin .../create-credentials.png | Bin .../create-project.png | Bin .../index.md} | 27 ++++++++++-------- .../links.png | Bin .../oauth-consent.png | Bin .../project-name.png | Bin .../redirect-uri.png | Bin .../script-start.png | Bin .../script-url.png | Bin .../test-auth.sh | 0 .../github-add-webhook.png | Bin .../github-webhook.png | Bin .../index.md} | 10 ++++--- .../openshift-buildconfig-webhook.png | Bin .../openshift-rebuild.png | Bin .../hugo-screenshot.png | Bin .../index.md} | 4 ++- .../speaking/devoteam-tech-for-people-2018.md | 14 --------- .../2018-10-10-Devoteam-TechForPeople-1.jpg | Bin .../2018-10-10-Devoteam-TechForPeople-2.jpg | Bin .../2018-10-10-Devoteam-TechForPeople-3.jpg | Bin .../2018-10-10-Devoteam-TechForPeople-4.jpg | Bin .../devoteam-tech-for-people-2018/index.md | 16 +++++++++++ .../2018-10-21-RHTE-Award.jpg | Bin .../index.md} | 4 ++- .../2019-10-21-RHTE-Award.png | Bin .../index.md} | 4 ++- hugo | 12 ++++++++ layouts/shortcodes/attachedFigure.html | 12 ++++---- layouts/shortcodes/attachedFileLink.html | 4 +++ netlify.toml | 2 +- 54 files changed, 97 insertions(+), 53 deletions(-) rename content/english/blog/{airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md => airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/index.md} (97%) rename {static => content/english}/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/pull.yaml (100%) rename {static => content/english}/blog/cleanup-playbook-3scale/cleanup.yaml (100%) rename content/english/blog/{cleanup-playbook-3scale.md => cleanup-playbook-3scale/index.md} (97%) rename content/english/blog/{configure-redhat-sso-3scale-cli.md => configure-redhat-sso-3scale-cli/index.md} (96%) rename {static => content/english}/blog/configure-redhat-sso-3scale-cli/openid-connect-issuer.png (100%) rename content/english/blog/{install-openwrt-raspberry-pi.md => install-openwrt-raspberry-pi/index.md} (98%) rename {static => content/english}/blog/install-openwrt-raspberry-pi/uart-pins.jpeg (100%) rename {static => content/english}/blog/jmeter-assess-software-performances/control1.png (100%) rename {static => content/english}/blog/jmeter-assess-software-performances/control2.png (100%) rename {static => content/english}/blog/jmeter-assess-software-performances/control3.png (100%) rename {static => content/english}/blog/jmeter-assess-software-performances/if.png (100%) rename content/english/blog/{jmeter-assess-software-performances.md => jmeter-assess-software-performances/index.md} (94%) rename {static => content/english}/blog/jmeter-assess-software-performances/thread-group.png (100%) rename {static => content/english}/blog/jmeter-assess-software-performances/udv.png (100%) rename content/english/blog/{nginx-with-tls-on-openwrt.md => nginx-with-tls-on-openwrt/index.md} (99%) rename {static => content/english}/blog/nginx-with-tls-on-openwrt/make-menuconfig.png (100%) rename {static => content/english}/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload/change-qos.yaml (100%) rename content/english/blog/{use-ansible-to-manage-the-qos-of-your-openshift-workload.md => use-ansible-to-manage-the-qos-of-your-openshift-workload/index.md} (97%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/auth-ok.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/auth.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/authorized-domains.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/create-credentials.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/create-project.png (100%) rename content/english/blog/{use-google-account-openid-connect-provider.md => use-google-account-openid-connect-provider/index.md} (85%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/links.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/oauth-consent.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/project-name.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/redirect-uri.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/script-start.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/script-url.png (100%) rename {static => content/english}/blog/use-google-account-openid-connect-provider/test-auth.sh (100%) rename {static => content/english}/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-add-webhook.png (100%) rename {static => content/english}/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-webhook.png (100%) rename content/english/blog/{writing-workshop-instructions-with-hugo-deploy-openshift.md => writing-workshop-instructions-with-hugo-deploy-openshift/index.md} (94%) rename {static => content/english}/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-buildconfig-webhook.png (100%) rename {static => content/english}/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-rebuild.png (100%) rename {static => content/english}/blog/writing-workshop-instructions-with-hugo/hugo-screenshot.png (100%) rename content/english/blog/{writing-workshop-instructions-with-hugo.md => writing-workshop-instructions-with-hugo/index.md} (98%) delete mode 100644 content/english/speaking/devoteam-tech-for-people-2018.md rename {static/speaking => content/english/speaking/devoteam-tech-for-people-2018}/2018-10-10-Devoteam-TechForPeople-1.jpg (100%) rename {static/speaking => content/english/speaking/devoteam-tech-for-people-2018}/2018-10-10-Devoteam-TechForPeople-2.jpg (100%) rename {static/speaking => content/english/speaking/devoteam-tech-for-people-2018}/2018-10-10-Devoteam-TechForPeople-3.jpg (100%) rename {static/speaking => content/english/speaking/devoteam-tech-for-people-2018}/2018-10-10-Devoteam-TechForPeople-4.jpg (100%) create mode 100644 content/english/speaking/devoteam-tech-for-people-2018/index.md rename {static/speaking => content/english/speaking/red-hat-tech-exchange-2018}/2018-10-21-RHTE-Award.jpg (100%) rename content/english/speaking/{red-hat-tech-exchange-2018.md => red-hat-tech-exchange-2018/index.md} (77%) rename {static/speaking => content/english/speaking/red-hat-tech-exchange-2019}/2019-10-21-RHTE-Award.png (100%) rename content/english/speaking/{red-hat-tech-exchange-2019.md => red-hat-tech-exchange-2019/index.md} (84%) create mode 100644 layouts/shortcodes/attachedFileLink.html diff --git a/archetypes/default.md b/archetypes/default.md index 0e07e13..9d4ceea 100644 --- a/archetypes/default.md +++ b/archetypes/default.md @@ -6,6 +6,9 @@ opensource: - project1 topics: - topic1 +resources: +#- src: '*.yaml' +#- src: '*.png' --- Headline. diff --git a/content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md b/content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/index.md similarity index 97% rename from content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md rename to content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/index.md index 9e82b1e..6a64690 100644 --- a/content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments.md +++ b/content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/index.md @@ -7,6 +7,8 @@ opensource: - Skopeo topics: - Containers +resources: +- src: '*.yaml' --- Some customers, especially large banks, have very tight security requirements. @@ -145,7 +147,7 @@ Finally, skopeo is called to download each image to */tmp/oci_registry*. with_items: '{{ images }}' ``` -The complete playbook [is available here](pull.yaml) and can be run as follow. +The complete playbook [is available here]({{< attachedFileLink src="pull.yaml" >}}) and can be run as follow. ```sh ansible-playbook pull.yaml -e token=$TOKEN diff --git a/static/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/pull.yaml b/content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/pull.yaml similarity index 100% rename from static/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/pull.yaml rename to content/english/blog/airgap-openshift-installation-move-registry-created-using-oc-adm-release-mirror-between-environments/pull.yaml diff --git a/static/blog/cleanup-playbook-3scale/cleanup.yaml b/content/english/blog/cleanup-playbook-3scale/cleanup.yaml similarity index 100% rename from static/blog/cleanup-playbook-3scale/cleanup.yaml rename to content/english/blog/cleanup-playbook-3scale/cleanup.yaml diff --git a/content/english/blog/cleanup-playbook-3scale.md b/content/english/blog/cleanup-playbook-3scale/index.md similarity index 97% rename from content/english/blog/cleanup-playbook-3scale.md rename to content/english/blog/cleanup-playbook-3scale/index.md index a1a4682..1738dad 100644 --- a/content/english/blog/cleanup-playbook-3scale.md +++ b/content/english/blog/cleanup-playbook-3scale/index.md @@ -7,6 +7,8 @@ opensource: topics: - API Management - IT Automation +resources: +- src: '*.yaml' --- If you are running integration tests embedding 3scale or are doing a lot of 3scale demos, you might sooner or later **have plenty of services declared in the 3scale Admin console**, which could reveal difficult to work with. @@ -59,7 +61,7 @@ export THREESCALE_TOKEN="$(oc get secret system-seed -o go-template --template=' Fetch the cleanup playbook. ```sh -curl -Lo cleanup.yaml {{< baseurl >}}blog/cleanup-playbook-3scale/cleanup.yaml +curl -Lo cleanup.yaml {{< attachedFileLink src="cleanup.yaml" >}} ``` ## Cleanup 3scale diff --git a/content/english/blog/configure-redhat-sso-3scale-cli.md b/content/english/blog/configure-redhat-sso-3scale-cli/index.md similarity index 96% rename from content/english/blog/configure-redhat-sso-3scale-cli.md rename to content/english/blog/configure-redhat-sso-3scale-cli/index.md index 721b5b1..8b0c3e9 100644 --- a/content/english/blog/configure-redhat-sso-3scale-cli.md +++ b/content/english/blog/configure-redhat-sso-3scale-cli/index.md @@ -6,6 +6,8 @@ opensource: - Keycloak topics: - OpenID Connect +resources: +- src: '*.png' --- [3scale API Management](https://3scale.github.io/) can be used in conjunction with [Red Hat SSO](https://access.redhat.com/products/red-hat-single-sign-on) / [Keycloak](https://www.keycloak.org/) to secure APIs managed by 3scale using the OpenID Connect protocol. @@ -96,7 +98,7 @@ You can use the following URL for the **OpenID Connect Issuer** (replace $SSO_HO https://zync:s3cr3t@$SSO_HOSTNAME/auth/realms/3scale ``` -![openid-connect-issuer](openid-connect-issuer.png) +{{< figure src="openid-connect-issuer.png" title="OpenID Connect Issuer settings in the 3scale Admin Portal." >}} Or when [deploying an API in 3scale with the 3scale toolbox](https://developers.redhat.com/blog/2019/07/29/3scale-toolbox-deploy-an-api-from-the-cli/), you can use: diff --git a/static/blog/configure-redhat-sso-3scale-cli/openid-connect-issuer.png b/content/english/blog/configure-redhat-sso-3scale-cli/openid-connect-issuer.png similarity index 100% rename from static/blog/configure-redhat-sso-3scale-cli/openid-connect-issuer.png rename to content/english/blog/configure-redhat-sso-3scale-cli/openid-connect-issuer.png diff --git a/content/english/blog/install-openwrt-raspberry-pi.md b/content/english/blog/install-openwrt-raspberry-pi/index.md similarity index 98% rename from content/english/blog/install-openwrt-raspberry-pi.md rename to content/english/blog/install-openwrt-raspberry-pi/index.md index a64270c..3882e5c 100644 --- a/content/english/blog/install-openwrt-raspberry-pi.md +++ b/content/english/blog/install-openwrt-raspberry-pi/index.md @@ -5,6 +5,8 @@ opensource: - OpenWRT topics: - Embedded Systems +resources: +- src: '*.jpeg' --- [OpenWRT](https://openwrt.org/) is a Linux distribution for embedded systems. @@ -70,7 +72,7 @@ screen /dev/ttyUSB0 115200 You then need to connect the VIN, GND, TXD and RXD wires to the correct GPIO pins of your Raspberry PI. -![GPIO UART pins](uart-pins.jpeg) +{{< figure src="uart-pins.jpeg" title="The UART Pins of the Raspberry PI 3" >}} Power-on your Raspberry PI, wait a couple seconds and press enter to display the OpenWRT prompt. diff --git a/static/blog/install-openwrt-raspberry-pi/uart-pins.jpeg b/content/english/blog/install-openwrt-raspberry-pi/uart-pins.jpeg similarity index 100% rename from static/blog/install-openwrt-raspberry-pi/uart-pins.jpeg rename to content/english/blog/install-openwrt-raspberry-pi/uart-pins.jpeg diff --git a/static/blog/jmeter-assess-software-performances/control1.png b/content/english/blog/jmeter-assess-software-performances/control1.png similarity index 100% rename from static/blog/jmeter-assess-software-performances/control1.png rename to content/english/blog/jmeter-assess-software-performances/control1.png diff --git a/static/blog/jmeter-assess-software-performances/control2.png b/content/english/blog/jmeter-assess-software-performances/control2.png similarity index 100% rename from static/blog/jmeter-assess-software-performances/control2.png rename to content/english/blog/jmeter-assess-software-performances/control2.png diff --git a/static/blog/jmeter-assess-software-performances/control3.png b/content/english/blog/jmeter-assess-software-performances/control3.png similarity index 100% rename from static/blog/jmeter-assess-software-performances/control3.png rename to content/english/blog/jmeter-assess-software-performances/control3.png diff --git a/static/blog/jmeter-assess-software-performances/if.png b/content/english/blog/jmeter-assess-software-performances/if.png similarity index 100% rename from static/blog/jmeter-assess-software-performances/if.png rename to content/english/blog/jmeter-assess-software-performances/if.png diff --git a/content/english/blog/jmeter-assess-software-performances.md b/content/english/blog/jmeter-assess-software-performances/index.md similarity index 94% rename from content/english/blog/jmeter-assess-software-performances.md rename to content/english/blog/jmeter-assess-software-performances/index.md index d7cc5b7..97c5a09 100644 --- a/content/english/blog/jmeter-assess-software-performances.md +++ b/content/english/blog/jmeter-assess-software-performances/index.md @@ -6,7 +6,7 @@ opensource: topics: - Performance testing resources: -- '**.png' +- '*.png' --- One of my side projects (the [Telegram Photo Bot](https://github.com/nmasse-itix/Telegram-Photo-Album-Bot)), have some performance issues that I will have to tackle. @@ -104,7 +104,7 @@ http { My first measure on the control (nginx) gave strange results. -{{< figure src="control1.png" title="First measure gave results too low to be representative of nginx's performances." >}} +{{< attachedFigure src="control1.png" title="First measure gave results too low to be representative of nginx's performances." >}} Less than 30 tps, even on an old ARM board, is definitely too low to be representative of nginx's performances. Using [Wireshark](https://www.wireshark.org/), I discovered that JMeter did not established [Keep-Alive connections](https://sqa.stackexchange.com/questions/38211/re-using-the-tcp-connections-with-jmeter-like-a-real-browser). @@ -137,13 +137,13 @@ httpclient.reset_state_on_thread_group_iteration=false With Keep-Alive enabled, the 1200 tps are much more inline with the known performance level of nginx. Except there is a performance drop every 10-15 seconds that is not expected. -{{< figure src="control2.png" title="Second measure shows a periodic performance drop." >}} +{{< attachedFigure src="control2.png" title="Second measure shows a periodic performance drop." >}} Using Wireshark, I discovered that during those performance drops, there are [TCP packets retransmissions](https://wiki.wireshark.org/DuplicatePackets). At that time, my Macbook Pro hosting the injector was connected **using Wifi**. I switched to a good old Ethernet cable, and this time the results on the control were as expected. -{{< figure src="control3.png" title="Third measure is ok." >}} +{{< attachedFigure src="control3.png" title="Third measure is ok." >}} As a conclusion, always have a control in your experience! @@ -151,7 +151,7 @@ As a conclusion, always have a control in your experience! To build my JMeter Test Plan, I started by adding a **User Defined Variables** component that holds all the settings related to lab environment (DNS names, ports, tokens, etc.). -{{< figure src="udv.png" title="JMeter User Defined Variables" >}} +{{< attachedFigure src="udv.png" title="JMeter User Defined Variables" >}} I added a variable named **scenario** whose value will be passed to JMeter from the CLI. This enables me to run all my experiments automatically from a script, one after another. @@ -163,12 +163,12 @@ ${__P(parameter-name,default-value)} I configured a **Thread Group** based on the **jp@gc - Ultimate Thread Group** with five concurrent users. -{{< figure src="thread-group.png" title="JMeter Thread Group" >}} +{{< attachedFigure src="thread-group.png" title="JMeter Thread Group" >}} And finally, a **Loop** component with three **If Controllers** underneath. Each **If Controller** holds an **HTTP Probe** configured for the target scenario. -{{< figure src="if.png" title="JMeter If Controller" >}} +{{< attachedFigure src="if.png" title="JMeter If Controller" >}} The If Controllers are defined with a **jexl3** expression, asserting the value of the **scenario** variable. diff --git a/static/blog/jmeter-assess-software-performances/thread-group.png b/content/english/blog/jmeter-assess-software-performances/thread-group.png similarity index 100% rename from static/blog/jmeter-assess-software-performances/thread-group.png rename to content/english/blog/jmeter-assess-software-performances/thread-group.png diff --git a/static/blog/jmeter-assess-software-performances/udv.png b/content/english/blog/jmeter-assess-software-performances/udv.png similarity index 100% rename from static/blog/jmeter-assess-software-performances/udv.png rename to content/english/blog/jmeter-assess-software-performances/udv.png diff --git a/content/english/blog/nginx-with-tls-on-openwrt.md b/content/english/blog/nginx-with-tls-on-openwrt/index.md similarity index 99% rename from content/english/blog/nginx-with-tls-on-openwrt.md rename to content/english/blog/nginx-with-tls-on-openwrt/index.md index ed2b1f9..90933f5 100644 --- a/content/english/blog/nginx-with-tls-on-openwrt.md +++ b/content/english/blog/nginx-with-tls-on-openwrt/index.md @@ -6,6 +6,8 @@ opensource: - nginx topics: - Embedded Systems +resources: +- '*.png' --- In the article "[Install OpenWRT on your Raspberry PI](../install-openwrt-raspberry-pi/)", I explained how to install OpenWRT on a Raspberry PI and the first steps as an OpenWRT user. @@ -85,7 +87,7 @@ Enter **Global Build Settings** and: * Press space to unset **Select all userspace packages by default** * Leave **Cryptographically sign packages** set -![make menuconfig](make-menuconfig.png) +{{< attachedFigure src="make-menuconfig.png" title="Parameters to activate in your make menuconfig" >}} Go back to the root menu. diff --git a/static/blog/nginx-with-tls-on-openwrt/make-menuconfig.png b/content/english/blog/nginx-with-tls-on-openwrt/make-menuconfig.png similarity index 100% rename from static/blog/nginx-with-tls-on-openwrt/make-menuconfig.png rename to content/english/blog/nginx-with-tls-on-openwrt/make-menuconfig.png diff --git a/static/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload/change-qos.yaml b/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload/change-qos.yaml similarity index 100% rename from static/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload/change-qos.yaml rename to content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload/change-qos.yaml diff --git a/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md b/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload/index.md similarity index 97% rename from content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md rename to content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload/index.md index 684ee0b..20a412d 100644 --- a/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload.md +++ b/content/english/blog/use-ansible-to-manage-the-qos-of-your-openshift-workload/index.md @@ -6,6 +6,8 @@ opensource: - Ansible topics: - IT Automation +resources: +- src: '*.yaml' --- As I was administering my OpenShift cluster, I found out that I had a too @@ -192,6 +194,6 @@ blacklist of critical namespaces that should not be touched. when: obj.namespace not in namespace_blacklist {{< / highlight >}} -You can find the complete playbook [here](change-qos.yaml). Of course, it is +You can find the complete playbook [here]({{< attachedFileLink src="change-qos.yaml" >}}). Of course, it is very rough and would need to more work to be used on a daily basis but for a single use this is sufficient. diff --git a/static/blog/use-google-account-openid-connect-provider/auth-ok.png b/content/english/blog/use-google-account-openid-connect-provider/auth-ok.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/auth-ok.png rename to content/english/blog/use-google-account-openid-connect-provider/auth-ok.png diff --git a/static/blog/use-google-account-openid-connect-provider/auth.png b/content/english/blog/use-google-account-openid-connect-provider/auth.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/auth.png rename to content/english/blog/use-google-account-openid-connect-provider/auth.png diff --git a/static/blog/use-google-account-openid-connect-provider/authorized-domains.png b/content/english/blog/use-google-account-openid-connect-provider/authorized-domains.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/authorized-domains.png rename to content/english/blog/use-google-account-openid-connect-provider/authorized-domains.png diff --git a/static/blog/use-google-account-openid-connect-provider/create-credentials.png b/content/english/blog/use-google-account-openid-connect-provider/create-credentials.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/create-credentials.png rename to content/english/blog/use-google-account-openid-connect-provider/create-credentials.png diff --git a/static/blog/use-google-account-openid-connect-provider/create-project.png b/content/english/blog/use-google-account-openid-connect-provider/create-project.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/create-project.png rename to content/english/blog/use-google-account-openid-connect-provider/create-project.png diff --git a/content/english/blog/use-google-account-openid-connect-provider.md b/content/english/blog/use-google-account-openid-connect-provider/index.md similarity index 85% rename from content/english/blog/use-google-account-openid-connect-provider.md rename to content/english/blog/use-google-account-openid-connect-provider/index.md index efb31c7..cab065c 100644 --- a/content/english/blog/use-google-account-openid-connect-provider.md +++ b/content/english/blog/use-google-account-openid-connect-provider/index.md @@ -3,6 +3,9 @@ title: "Use your Google Account as an OpenID Connect provider" date: 2020-03-27T00:00:00+02:00 topics: - OpenID Connect +resources: +- src: '*.png' +- src: '*.sh' --- We have passwords everywhere: to unlock our computer, to reach our inbox, to login as root on our Raspberry PI, etc. @@ -47,15 +50,15 @@ First, connect to the [Google Developer Console](https://console.developers.goog Click **Create Project**. -![create project](create-project.png) +{{< attachedFigure src="create-project.png" title="Click 'Create Project'." >}} Fill-in the **Project name** (free choice). The location does not matter. Click **Create**. -![project name](project-name.png) +{{< attachedFigure src="project-name.png" title="Fill-in the 'Project name'. Click 'Create'." >}} Click **OAuth Consent screen**. If you are a Google Suite user, select **Internal**. If you are a regular GMail user, select **External**. Click **Create**. -![oauth-consent](oauth-consent.png) +{{< attachedFigure src="oauth-consent.png" title="The OAuth Consent screen." >}} Choose an application name (free choice). Leave the default scopes. @@ -63,15 +66,15 @@ Add your personal domain to the list of **Authorized Domains**. For instance, if your target service is at *raspberry-pi.example.test*, add **example.test**. **DO NOT FORGET to press Enter!** -![authorized-domains](authorized-domains.png) +{{< attachedFigure src="authorized-domains.png" title="Add your personal domain to the list of Authorized Domains." >}} Fill-in the **Application Homepage Link** and **Application Privacy Policy Link** (free choices). Click **Save**. -![links](links.png) +{{< attachedFigure src="links.png" title="Fill-in the links." >}} Click **Credentials**. Select **+ Create Credentials**, then **OAuth Client ID**. -![create-credentials](create-credentials.png) +{{< attachedFigure src="create-credentials.png" title="Create the OAuth credentials." >}} Under **Application type**, select **Web Application**. Choose a name for your application (free choice). @@ -83,7 +86,7 @@ To be able to do so, we need to add a special Redirect URI: **http://localhost:6 Click **Create**. -![redirect-uri](redirect-uri.png) +{{< attachedFigure src="redirect-uri.png" title="Fill-in the Redirect URI." >}} Google generated a **Client ID** and **Client Secret** for you. Keep them somewhere safe! @@ -94,7 +97,7 @@ There are several open source tools to test your OpenID Connect setup but a very Download the following script and make it executable. ```sh -curl -o test-auth.sh {{< baseurl >}}blog/use-google-account-openid-connect-provider/test-auth.sh +curl -o test-auth.sh {{< attachedFileLink src="test-auth.sh" >}} chmod 755 test-auth.sh ``` @@ -113,15 +116,15 @@ Now, run this script! The script generates a URL that you need to copy and paste in your web browser. -![script-start](script-start.png) +{{< attachedFigure src="script-start.png" title="The script generates a URL that you need to copy and paste in your web browser." >}} If you are not yet logged in, Google asks you to authenticate. -![auth](auth.png) +{{< attachedFigure src="auth.png" title="If you are not yet logged in, Google asks you to authenticate." >}} Once logged in or if you are already logged in, you are redirected to the fake Redirect URI we registered earlier. -![auth-ok](auth-ok.png) +{{< attachedFigure src="auth-ok.png" title="You are redirected to the fake Redirect URI we registered earlier" >}} We registered a fake Redirect URI so that we could play each part of the OpenID Connect exchange manually. **So, if you see an error message from your web browser saying that it cannot connect to the target service: THIS IS EXPECTED FOR OUR TEST.** @@ -131,7 +134,7 @@ Once the browser is redirected at `http://localhost:666/stop-here`, copy the red Remember that the Authorization Code is very short lived. So, be quick! -![script-url](script-url.png) +{{< attachedFigure src="script-url.png" title="Paste the Redirect URI." >}} The script contacts the Authorization Server to get an Access Token from the Authorization Code captured in the Redirect URI. diff --git a/static/blog/use-google-account-openid-connect-provider/links.png b/content/english/blog/use-google-account-openid-connect-provider/links.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/links.png rename to content/english/blog/use-google-account-openid-connect-provider/links.png diff --git a/static/blog/use-google-account-openid-connect-provider/oauth-consent.png b/content/english/blog/use-google-account-openid-connect-provider/oauth-consent.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/oauth-consent.png rename to content/english/blog/use-google-account-openid-connect-provider/oauth-consent.png diff --git a/static/blog/use-google-account-openid-connect-provider/project-name.png b/content/english/blog/use-google-account-openid-connect-provider/project-name.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/project-name.png rename to content/english/blog/use-google-account-openid-connect-provider/project-name.png diff --git a/static/blog/use-google-account-openid-connect-provider/redirect-uri.png b/content/english/blog/use-google-account-openid-connect-provider/redirect-uri.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/redirect-uri.png rename to content/english/blog/use-google-account-openid-connect-provider/redirect-uri.png diff --git a/static/blog/use-google-account-openid-connect-provider/script-start.png b/content/english/blog/use-google-account-openid-connect-provider/script-start.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/script-start.png rename to content/english/blog/use-google-account-openid-connect-provider/script-start.png diff --git a/static/blog/use-google-account-openid-connect-provider/script-url.png b/content/english/blog/use-google-account-openid-connect-provider/script-url.png similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/script-url.png rename to content/english/blog/use-google-account-openid-connect-provider/script-url.png diff --git a/static/blog/use-google-account-openid-connect-provider/test-auth.sh b/content/english/blog/use-google-account-openid-connect-provider/test-auth.sh similarity index 100% rename from static/blog/use-google-account-openid-connect-provider/test-auth.sh rename to content/english/blog/use-google-account-openid-connect-provider/test-auth.sh diff --git a/static/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-add-webhook.png b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-add-webhook.png similarity index 100% rename from static/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-add-webhook.png rename to content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-add-webhook.png diff --git a/static/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-webhook.png b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-webhook.png similarity index 100% rename from static/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-webhook.png rename to content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/github-webhook.png diff --git a/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/index.md similarity index 94% rename from content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md rename to content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/index.md index b8086b9..5381951 100644 --- a/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift.md +++ b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/index.md @@ -4,6 +4,8 @@ date: 2019-02-27T00:00:00+02:00 opensource: - Hugo - OpenShift +resources: +- '*.png' --- This is the third part of my series covering how to @@ -166,25 +168,25 @@ First, get the GitHub Webhook URL of your BuildConfig: - Open the **Configuration** tab - Copy the **GitHub Webhook URL** -![The BuildConfig on OpenShift](openshift-buildconfig-webhook.png) +{{< attachedFigure src="openshift-buildconfig-webhook.png" title="The BuildConfig on OpenShift." >}} Then, go on your GitHub repository and add a webhook: - Go to **Settings** > **Webhooks** - Click **Add webhook** -![Add a webhook on GitHub](github-add-webhook.png) +{{< attachedFigure src="github-add-webhook.png" title="Add a webhook on GitHub." >}} - Paste your Webhook URL in the **Payload URL** field - Select `application/json` in the **Content type** dropdown list - Check **Disable** in the **SSL verification** section if your OpenShift console has a self-signed certificate - Click **Add webhook** -![The GitHub webhook](github-webhook.png) +{{< attachedFigure src="github-webhook.png" title="The GitHub webhook." >}} Try to push some changes to your GitHub repository and see OpenShift rebuilding and deploying your website! -![OpenShift rebuilding and redeploying your website](openshift-rebuild.png) +{{< attachedFigure src="openshift-rebuild.png" title="OpenShift rebuilding and redeploying your website" >}} ## Conclusion diff --git a/static/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-buildconfig-webhook.png b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-buildconfig-webhook.png similarity index 100% rename from static/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-buildconfig-webhook.png rename to content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-buildconfig-webhook.png diff --git a/static/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-rebuild.png b/content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-rebuild.png similarity index 100% rename from static/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-rebuild.png rename to content/english/blog/writing-workshop-instructions-with-hugo-deploy-openshift/openshift-rebuild.png diff --git a/static/blog/writing-workshop-instructions-with-hugo/hugo-screenshot.png b/content/english/blog/writing-workshop-instructions-with-hugo/hugo-screenshot.png similarity index 100% rename from static/blog/writing-workshop-instructions-with-hugo/hugo-screenshot.png rename to content/english/blog/writing-workshop-instructions-with-hugo/hugo-screenshot.png diff --git a/content/english/blog/writing-workshop-instructions-with-hugo.md b/content/english/blog/writing-workshop-instructions-with-hugo/index.md similarity index 98% rename from content/english/blog/writing-workshop-instructions-with-hugo.md rename to content/english/blog/writing-workshop-instructions-with-hugo/index.md index 88f6748..b5a566e 100644 --- a/content/english/blog/writing-workshop-instructions-with-hugo.md +++ b/content/english/blog/writing-workshop-instructions-with-hugo/index.md @@ -3,6 +3,8 @@ title: "Writing workshop instructions with Hugo" date: 2019-02-20T00:00:00+02:00 opensource: - Hugo +resources: +- '*.png' --- In my professional life, I often have to lead workshops with customers or @@ -199,7 +201,7 @@ git push -u origin master Congratulations! You now have your training instructions neatly organised and clearly presented. Maintenance and collaboration have been greatly simplified! -![Screenshot of our mini-training](hugo-screenshot.png) +{{< attachedFigure src="hugo-screenshot.png" title="Screenshot of our mini-training." >}} In this first part of the series, we presented a very light introduction to Hugo and its application to workshop instructions. Be sure to read [part 2: Writing workshop instructions with Hugo, with variables in your content](../writing-workshop-instructions-with-hugo-variables/) to discover advanced usages. diff --git a/content/english/speaking/devoteam-tech-for-people-2018.md b/content/english/speaking/devoteam-tech-for-people-2018.md deleted file mode 100644 index c8caf5b..0000000 --- a/content/english/speaking/devoteam-tech-for-people-2018.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Devoteam #TechForPeople 2018" -date: 2018-10-10T00:00:00+02:00 -draft: false ---- - -The 10th Septembre 2018, I co-presented a session named _"No API, No Future"_ -in which I exhibited the Red Hat's API Lifecycle Automation. The event -`#TechForPeople` was organized by Devoteam. - -![Devoteam #TechForPeople](/speaking/2018-10-10-Devoteam-TechForPeople-1.jpg) -![Devoteam #TechForPeople](/speaking/2018-10-10-Devoteam-TechForPeople-2.jpg) -![Devoteam #TechForPeople](/speaking/2018-10-10-Devoteam-TechForPeople-3.jpg) -![Devoteam #TechForPeople](/speaking/2018-10-10-Devoteam-TechForPeople-4.jpg) diff --git a/static/speaking/2018-10-10-Devoteam-TechForPeople-1.jpg b/content/english/speaking/devoteam-tech-for-people-2018/2018-10-10-Devoteam-TechForPeople-1.jpg similarity index 100% rename from static/speaking/2018-10-10-Devoteam-TechForPeople-1.jpg rename to content/english/speaking/devoteam-tech-for-people-2018/2018-10-10-Devoteam-TechForPeople-1.jpg diff --git a/static/speaking/2018-10-10-Devoteam-TechForPeople-2.jpg b/content/english/speaking/devoteam-tech-for-people-2018/2018-10-10-Devoteam-TechForPeople-2.jpg similarity index 100% rename from static/speaking/2018-10-10-Devoteam-TechForPeople-2.jpg rename to content/english/speaking/devoteam-tech-for-people-2018/2018-10-10-Devoteam-TechForPeople-2.jpg diff --git a/static/speaking/2018-10-10-Devoteam-TechForPeople-3.jpg b/content/english/speaking/devoteam-tech-for-people-2018/2018-10-10-Devoteam-TechForPeople-3.jpg similarity index 100% rename from static/speaking/2018-10-10-Devoteam-TechForPeople-3.jpg rename to content/english/speaking/devoteam-tech-for-people-2018/2018-10-10-Devoteam-TechForPeople-3.jpg diff --git a/static/speaking/2018-10-10-Devoteam-TechForPeople-4.jpg b/content/english/speaking/devoteam-tech-for-people-2018/2018-10-10-Devoteam-TechForPeople-4.jpg similarity index 100% rename from static/speaking/2018-10-10-Devoteam-TechForPeople-4.jpg rename to content/english/speaking/devoteam-tech-for-people-2018/2018-10-10-Devoteam-TechForPeople-4.jpg diff --git a/content/english/speaking/devoteam-tech-for-people-2018/index.md b/content/english/speaking/devoteam-tech-for-people-2018/index.md new file mode 100644 index 0000000..7f2a512 --- /dev/null +++ b/content/english/speaking/devoteam-tech-for-people-2018/index.md @@ -0,0 +1,16 @@ +--- +title: "Devoteam #TechForPeople 2018" +date: 2018-10-10T00:00:00+02:00 +draft: false +resources: +- '*.png' +--- + +The 10th Septembre 2018, I co-presented a session named _"No API, No Future"_ +in which I exhibited the Red Hat's API Lifecycle Automation. The event +`#TechForPeople` was organized by Devoteam. + +{{< attachedFigure src="2018-10-10-Devoteam-TechForPeople-1.jpg" >}} +{{< attachedFigure src="2018-10-10-Devoteam-TechForPeople-2.jpg" >}} +{{< attachedFigure src="2018-10-10-Devoteam-TechForPeople-3.jpg" >}} +{{< attachedFigure src="2018-10-10-Devoteam-TechForPeople-4.jpg" >}} diff --git a/static/speaking/2018-10-21-RHTE-Award.jpg b/content/english/speaking/red-hat-tech-exchange-2018/2018-10-21-RHTE-Award.jpg similarity index 100% rename from static/speaking/2018-10-21-RHTE-Award.jpg rename to content/english/speaking/red-hat-tech-exchange-2018/2018-10-21-RHTE-Award.jpg diff --git a/content/english/speaking/red-hat-tech-exchange-2018.md b/content/english/speaking/red-hat-tech-exchange-2018/index.md similarity index 77% rename from content/english/speaking/red-hat-tech-exchange-2018.md rename to content/english/speaking/red-hat-tech-exchange-2018/index.md index ffca08e..ad8ea44 100644 --- a/content/english/speaking/red-hat-tech-exchange-2018.md +++ b/content/english/speaking/red-hat-tech-exchange-2018/index.md @@ -2,6 +2,8 @@ title: "Red Hat Tech Exchange 2018" date: 2018-09-21T00:00:00+02:00 draft: false +resources: +- '*.jpg' --- From the 17th to 21th Septembre 2018, I co-presented two sessions: @@ -12,4 +14,4 @@ From the 17th to 21th Septembre 2018, I co-presented two sessions: For the session _An API Journey: from mock to deployment_, we received an award based on the amazing feedbacks from the public! -![We received our award, on-stage!](/speaking/2018-10-21-RHTE-Award.jpg) +{{< attachedFigure src="2018-10-21-RHTE-Award.jpg" title="We received our award, on-stage!" >}} diff --git a/static/speaking/2019-10-21-RHTE-Award.png b/content/english/speaking/red-hat-tech-exchange-2019/2019-10-21-RHTE-Award.png similarity index 100% rename from static/speaking/2019-10-21-RHTE-Award.png rename to content/english/speaking/red-hat-tech-exchange-2019/2019-10-21-RHTE-Award.png diff --git a/content/english/speaking/red-hat-tech-exchange-2019.md b/content/english/speaking/red-hat-tech-exchange-2019/index.md similarity index 84% rename from content/english/speaking/red-hat-tech-exchange-2019.md rename to content/english/speaking/red-hat-tech-exchange-2019/index.md index 290f322..98b16d0 100644 --- a/content/english/speaking/red-hat-tech-exchange-2019.md +++ b/content/english/speaking/red-hat-tech-exchange-2019/index.md @@ -2,6 +2,8 @@ title: "Red Hat Tech Exchange 2019" date: 2019-10-21T00:00:00+02:00 draft: false +resources: +- '*.png' --- During the three Red Hat Tech Exchange sessions (Americas, EMEA and APAC), I presented two sessions: @@ -11,4 +13,4 @@ During the three Red Hat Tech Exchange sessions (Americas, EMEA and APAC), I pre The session _Leverage the power of open source communities to manage your APIs_ has been the second best voted session in RHTE APAC! -![I received an award!](/speaking/2019-10-21-RHTE-Award.png) +{{< attachedFigure src="2019-10-21-RHTE-Award.png" title="I received an award!" >}} diff --git a/hugo b/hugo index 7d7c293..5a127ea 100755 --- a/hugo +++ b/hugo @@ -6,6 +6,8 @@ trap cleanup SIGINT SIGTERM ERR EXIT function cleanup() { trap - SIGINT SIGTERM ERR EXIT + # On exit, remove any symbolic link in content/french that points + # to content/english find content/french -type l -print0 | while IFS= read -r -d $'\0' filename; do if realpath "$filename" | grep -E "^$PWD/" > /dev/null; then rm -f "$filename" @@ -13,12 +15,22 @@ function cleanup() { done } +# First, try to find page bundles. In that case, link the directory +(cd content/english && find * -type f -name 'index.md') | while read file; do + if [ ! -e "content/french/$file" ]; then + d="$(dirname $file)" + ln -s ../../../content/english/$d content/french/$d + fi +done + +# Then, find the regular pages and link the files directly. (cd content/english && find * -type f -name '*.md') | while read file; do if [ ! -e "content/french/$file" ]; then ln -s ../../../content/english/$file content/french/$file fi done +# Remove dangling links find content/french -xtype l -exec rm -f {} \; hugo gen chromastyles --style=borland > static/css/chroma.css diff --git a/layouts/shortcodes/attachedFigure.html b/layouts/shortcodes/attachedFigure.html index a02f8fa..8cc3f04 100644 --- a/layouts/shortcodes/attachedFigure.html +++ b/layouts/shortcodes/attachedFigure.html @@ -1,11 +1,11 @@ -{{ $filename := .Get "src" }} -{{ $image := .Page.Resources.GetMatch (printf "%s" $filename) }} +{{- $filename := .Get "src" -}} +{{- $image := .Page.Resources.GetMatch (printf "%s" $filename) -}}

- - {{ with .Get "title" }} + + {{- with .Get "title" }}
- {{ . }} + {{- . -}}
- {{ end }} + {{- end }}
\ No newline at end of file diff --git a/layouts/shortcodes/attachedFileLink.html b/layouts/shortcodes/attachedFileLink.html new file mode 100644 index 0000000..7d90ae4 --- /dev/null +++ b/layouts/shortcodes/attachedFileLink.html @@ -0,0 +1,4 @@ + +{{- $filename := .Get "src" -}} +{{- $file := .Page.Resources.GetMatch (printf "%s" $filename) -}} +{{- $file.Permalink -}} \ No newline at end of file diff --git a/netlify.toml b/netlify.toml index 4d77cc5..e8bc6a4 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,6 +1,6 @@ [build] publish = "public" -command = "./hugo" +command = "./hugo --baseURL https://www.itix.fr" [build.environment] # Global HUGO_VERSION = "0.42" From f8a25650b6928b5e0839fdc746d04c6720d0d01e Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Tue, 22 Dec 2020 23:22:24 +0100 Subject: [PATCH 13/15] update theme --- themes/itix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/itix b/themes/itix index 10a2f31..00566ec 160000 --- a/themes/itix +++ b/themes/itix @@ -1 +1 @@ -Subproject commit 10a2f3146b8bd329c7c5cb2b934e8931c184a80a +Subproject commit 00566ecb7531a3949545369cca4954e479218398 From 45defa37fd6fce68ba908a3bc9156dffdb947d1c Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Wed, 23 Dec 2020 11:11:45 +0100 Subject: [PATCH 14/15] fix dead link --- .../blog/writing-workshop-instructions-with-hugo-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/english/blog/writing-workshop-instructions-with-hugo-variables.md b/content/english/blog/writing-workshop-instructions-with-hugo-variables.md index c6bd9f5..1674124 100644 --- a/content/english/blog/writing-workshop-instructions-with-hugo-variables.md +++ b/content/english/blog/writing-workshop-instructions-with-hugo-variables.md @@ -49,7 +49,7 @@ Test locally your changes new website by running: hugo server -D ``` -You can now open [localhost:1313/packaging/git-commit/](http://localhost:1313/packaging/git-commit/) +You can now open http://localhost:1313/packaging/git-commit/ and confirm that variables have been expanded: ```md From fb4feb5363be110c2b2493d91c82b6a5a8469d51 Mon Sep 17 00:00:00 2001 From: Nicolas MASSE Date: Wed, 23 Dec 2020 11:14:46 +0100 Subject: [PATCH 15/15] update theme --- themes/itix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/itix b/themes/itix index 00566ec..d16133d 160000 --- a/themes/itix +++ b/themes/itix @@ -1 +1 @@ -Subproject commit 00566ecb7531a3949545369cca4954e479218398 +Subproject commit d16133dbc5c4b584f71d249f98f76889c1b9e0c5