<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://www.momh.fr/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>momh</title>
	<link>https://momh.fr/</link>
	<description>My Own Memory Hole se veut une sorte de &#171;&#160;vitrine&#160;&#187; de mon parcours et de mon exp&#233;rience mais aussi de mes centres d'int&#233;r&#234;t et constitue donc en quelque sorte ma m&#233;moire en ligne, m&#233;moire virtuelle d&#233;localis&#233;e mais ordonn&#233;e et index&#233;e&#8230;</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://www.momh.fr/spip.php?id_mot=2&amp;page=backend" rel="self" type="application/rss+xml" />




<item xml:lang="fr">
		<title>Du nouveau dans mon terminal</title>
		<link>https://www.momh.fr/du-nouveau-dans-mon-terminal</link>
		<guid isPermaLink="true">https://www.momh.fr/du-nouveau-dans-mon-terminal</guid>
		<dc:date>2026-09-12T19:59:02Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>bricebou@momh.fr</dc:creator>


		<dc:subject>terminal</dc:subject>
		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Apr&#232;s avoir exp&#233;riment&#233; divers terminaux, jongl&#233; entre &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt; et Fish sur plusieurs ordinateurs, test&#233; Oh My Posh puis Starship comme &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;d&#233;corateur&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de prompt, me voil&#224; je crois d&#233;sormais bien satisfait de ma configuration actuelle. &lt;br class='autobr' /&gt; Ainsi, j'ai fini par d&#233;finitivement opter pour Alacritty comme terminal, pr&#233;f&#233;rant &#224; des solutions plus riches en fonctionnalit&#233;s mais aussi plus &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;lourdes&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; &#224; l'usage sa simplicit&#233; et sa r&#233;activit&#233;, ce que les d&#233;veloppeur&#8901;euses r&#233;sument tr&#232;s bien ainsi sur le&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/terminal" rel="tag"&gt;terminal&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Apr&#232;s avoir exp&#233;riment&#233; divers terminaux, jongl&#233; entre &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt; et Fish sur plusieurs ordinateurs, test&#233; &lt;a href=&#034;https://ohmyposh.dev/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Oh My Posh&lt;/a&gt; puis &lt;a href=&#034;https://starship.rs/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Starship&lt;/a&gt; comme &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;d&#233;corateur&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de prompt, me voil&#224; je crois d&#233;sormais bien satisfait de ma configuration actuelle.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Ainsi, j'ai fini par d&#233;finitivement opter pour &lt;a href=&#034;https://alacritty.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Alacritty&lt;/a&gt; comme terminal, pr&#233;f&#233;rant &#224; des solutions plus riches en fonctionnalit&#233;s mais aussi plus &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;lourdes&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; &#224; l'usage sa simplicit&#233; et sa r&#233;activit&#233;, ce que les d&#233;veloppeur&#8901;euses r&#233;sument tr&#232;s bien ainsi sur le &lt;a href=&#034;https://github.com/alacritty/alacritty#faq&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Github du projet&lt;/a&gt;&#160;:&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;This means you won't find things like tabs or splits (which are best left to a window manager or terminal multiplexer) nor niceties like a &lt;span class=&#034;caps&#034;&gt;GUI&lt;/span&gt; config editor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et je me suis alors lanc&#233; &#224; la recherche d'un multiplexeur de terminal, m'&#233;tant lass&#233; si l'on peut dire de tmux que j'ai utilis&#233; durant de longues ann&#233;es&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; et c'est ainsi que j'ai d&#233;couvert &lt;a href=&#034;https://zellij.dev/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Zellij&lt;/a&gt; qui m'a v&#233;ritablement s&#233;duit par sa simplicit&#233; (dans sa gestion des onglets et des panneaux), par la possibilit&#233; de faire flotter un panneau, par l'affichage permanent des raccourcis...&lt;/p&gt;
&lt;p&gt;Pour ce qui est du shell, je suis revenu finalement &#224; &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt;, d&#233;laissant Oh My Posh ou Starship pour retourner au premier th&#232;me que j'avais utilis&#233; lors de ma d&#233;couverte de &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt;, &lt;a href=&#034;https://github.com/romkatv/powerlevel10k&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Powerlevel10k&lt;/a&gt;, celui-ci g&#233;rant beaucoup mieux les gros d&#233;p&#244;ts &lt;span class=&#034;caps&#034;&gt;GIT&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Voici pour ma configuration de &lt;span class=&#034;caps&#034;&gt;ZSH&lt;/span&gt;&#160;:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.zshrc&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# ## Powerlevel10k instant prompt &#8212; DOIT rester tout en haut du fichier, ## avant tout le reste (compinit, antidote, etc.). C'est ce qui permet ## d'afficher un prompt instantan&#233;ment pendant que le reste se charge ## en arri&#232;re-plan. # if [[ -r &#034;${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh&#034; ]]; then source &#034;${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh&#034; fi # ## Compl&#233;tion &#8212; mise en cache pour &#233;viter de refaire l'audit de s&#233;curit&#233; ## &#224; chaque lancement # zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path &#034;${XDG_CACHE_HOME:-$HOME/.cache}/zsh/compcache&#034; autoload -Uz compinit zcd=&#034;${ZDOTDIR:-$HOME}/.zcompdump&#034; if [[ -n ${zcd}(#qN.mh+24) ]]; then compinit else compinit -C fi unset zcd # ## Historique &#8212; absent par d&#233;faut en zsh nu (contrairement &#224; bash), ## n&#233;cessaire pour la persistance entre sessions et pour que ## zsh-autosuggestions ait quelque chose &#224; sugg&#233;rer. # HISTFILE=&#034;${ZDOTDIR:-$HOME}/.zsh_history&#034; HISTSIZE=50000 SAVEHIST=50000 setopt EXTENDED_HISTORY # horodatage de chaque commande setopt HIST_EXPIRE_DUPS_FIRST # purge les doublons en premier si besoin de place setopt HIST_IGNORE_DUPS # ignore les doublons cons&#233;cutifs imm&#233;diats setopt HIST_IGNORE_ALL_DUPS # supprime l'ancienne occurrence d'un doublon setopt HIST_FIND_NO_DUPS setopt HIST_IGNORE_SPACE # une commande pr&#233;c&#233;d&#233;e d'un espace n'est pas enregistr&#233;e setopt HIST_SAVE_NO_DUPS setopt HIST_VERIFY setopt SHARE_HISTORY # historique partag&#233; en temps r&#233;el entre tous les panes/onglets ouverts setopt APPEND_HISTORY setopt INC_APPEND_HISTORY_TIME # ## D&#233;sactive le check de mise &#224; jour d'Oh My Zsh (on utilise juste sa ## couche de compatibilit&#233; via getantidote/use-omz, pas le framework ## complet &#8212; ce check tournait &#224; chaque d&#233;marrage pour rien). # zstyle ':omz:update' mode disabled # ## Lazy-load antidote and generate the static load file only when needed # zsh_plugins=${ZDOTDIR:-$HOME}/.zsh_plugins if [[ ! ${zsh_plugins}.zsh -nt ${zsh_plugins}.txt ]]; then ( source &#034;/usr/share/zsh-antidote/antidote.zsh&#034; antidote bundle &lt;${zsh_plugins}.txt &gt;${zsh_plugins}.zsh ) fi source ${zsh_plugins}.zsh # ## fzf-tab &#8212; r&#233;glages recommand&#233;s # zstyle ':completion:*:git-checkout:*' sort false zstyle ':completion:*:descriptions' format '[%d]' zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} zstyle ':completion:*' menu no zstyle ':fzf-tab:complete:cd:*' fzf-preview 'ls --color $realpath' zstyle ':fzf-tab:*' switch-group ',' '.' # ## Paths # path=( $path &#034;${ZDOTDIR:-$HOME}/bin/&#034; &#034;${ZDOTDIR:-$HOME}/.composer/vendor/bin/&#034; &#034;${ZDOTDIR:-$HOME}/.local/bin/&#034; ) # ## Lazy load SSH agent # function _load_ssh_agent() { if [ -z &#034;$SSH_AUTH_SOCK&#034; ]; then eval &#034;$(ssh-agent -s)&#034; &gt; /dev/null fi } autoload -U add-zsh-hook add-zsh-hook precmd _load_ssh_agent # # Load other dotfiles # declare -a DOTFILES_TO_LOAD=( &#034;${ZDOTDIR:-$HOME}/.zaliases&#034; &#034;${ZDOTDIR:-$HOME}/spip-cli/bin/spip_console_autocomplete&#034; ) for i in ${DOTFILES_TO_LOAD[*]}; do if [ -f &#034;$i&#034; ]; then source &#034;$i&#034; &amp;&gt; /dev/null fi done # ## Titre du terminal &#8212; &#233;quivalent l&#233;ger de zsh-tab-title, sans le co&#251;t ## mesur&#233; au zprof. Snippet officiel de l'auteur de Powerlevel10k (MIT), ## voir https://github.com/romkatv/powerlevel10k/issues/1092 # function set-term-title() { emulate -L zsh if [[ -t 1 ]]; then print -rn -- $'\e]0;'${(V)1}$'\a' elif [[ -w $TTY ]]; then print -rn -- $'\e]0;'${(V)1}$'\a' &gt;$TTY fi } function set-term-title-preexec() { set-term-title $1 } function _term_title_path() { emulate -L zsh local path=&#034;${PWD/#$HOME/~}&#034; local -a parts parts=(&#034;${(s:/:)path}&#034;) if (( ${#parts} &gt; 3 )); then print -rn -- &#034;&#8230;/${(j:/:)parts[-3,-1]}&#034; else print -rn -- &#034;$path&#034; fi } function set-term-title-precmd() { set-term-title &#034;$(_term_title_path)&#034; } add-zsh-hook preexec set-term-title-preexec add-zsh-hook precmd set-term-title-precmd # # https://github.com/voronkovich/symfony-complete.plugin.zsh # compdef _symfony_complete symfony compdef _symfony_complete console compdef _symfony_complete artisan compdef _symfony_complete phpstan # ## Powerlevel10k &#8212; config g&#233;n&#233;r&#233;e/personnalis&#233;e # [[ ! -f ${ZDOTDIR:-$HOME}/.p10k.zsh ]] || source ${ZDOTDIR:-$HOME}/.p10k.zsh &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.p10k.zsh&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# Config Powerlevel10k &#8212; palette gruvbox dark, sans modules de langage. # Ce fichier ne couvre que l'essentiel ; lancez `p10k configure` &#224; tout # moment pour ouvrir l'assistant interactif et affiner ic&#244;nes/s&#233;parateurs # au-del&#224; de ce qui est fix&#233; ici &#8212; il r&#233;g&#233;n&#233;rera ce fichier en conservant # la structure ci-dessous si vous relancez ensuite ce script par-dessus. 'builtin' 'local' '-a' 'p10k_config_opts' [[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases') [[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob') [[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand') 'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand' () { emulate -L zsh -o extended_glob # Segments affich&#233;s &#224; gauche, dans l'ordre. typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon dir vcs) # Segments affich&#233;s &#224; droite. typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time time) typeset -g POWERLEVEL9K_MODE=nerdfont-complete typeset -g POWERLEVEL9K_ICON_PADDING=moderate typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true # Style powerline avec s&#233;parateurs en chevrons (angles), comme oh-my-posh. typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=$'\uE0B0' typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR=$'\uE0B0' typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR=$'\uE0B1' typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL=$'\uE0B2' typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR=$'\uE0B2' typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR=$'\uE0B3' # ## Palette gruvbox dark (m&#234;mes couleurs que votre starship.toml) # local fg0='#fbf1c7' local bg1='#3c3836' local bg3='#665c54' local blue='#458588' local aqua='#689d6a' local green='#98971a' local orange='#d65d0e' local red='#cc241d' local yellow='#d79921' # OS icon typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=$orange # Directory typeset -g POWERLEVEL9K_DIR_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_DIR_BACKGROUND=$yellow typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_last typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=3 typeset -g POWERLEVEL9K_SHORTEN_DELIMITER='&#8230;/' # Git (vcs) &#8212; couleur unique quel que soit l'&#233;tat, comme votre config # Starship actuelle (aqua). Changez *_BACKGROUND ci-dessous si vous # pr&#233;f&#233;rez une couleur diff&#233;rente pour &#034;propre&#034; vs &#034;modifi&#233;&#034;. typeset -g POWERLEVEL9K_VCS_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=$aqua typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=$aqua typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=$aqua typeset -g POWERLEVEL9K_VCS_BRANCH_ICON=$'\uf126 ' typeset -g POWERLEVEL9K_VCS_GIT_ICON='' # Filet de s&#233;curit&#233; pour les tr&#232;s gros repos (le souci qu'on avait avec # Starship/libgit2) : au-del&#224; de ce nombre de fichiers modifi&#233;s, affiche # un indicateur approximatif plut&#244;t que de tout compter pr&#233;cis&#233;ment. typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=4000 # Indicateurs d'&#233;tat en caract&#232;res simples plut&#244;t qu'en ic&#244;nes rondes # qui se ressemblent trop entre elles. typeset -g POWERLEVEL9K_VCS_STAGED_ICON='+' typeset -g POWERLEVEL9K_VCS_UNSTAGED_ICON='!' typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' typeset -g POWERLEVEL9K_VCS_CONFLICTED_ICON='&#10008;' typeset -g POWERLEVEL9K_VCS_COMMITS_AHEAD_ICON='&#8673;' typeset -g POWERLEVEL9K_VCS_COMMITS_BEHIND_ICON='&#8675;' typeset -g POWERLEVEL9K_VCS_STASH_ICON='*' typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON='' typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON='' # Status (code de sortie de la derni&#232;re commande) typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=$green typeset -g POWERLEVEL9K_STATUS_OK_BACKGROUND=$bg1 typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=$red typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=$bg1 typeset -g POWERLEVEL9K_STATUS_OK=false typeset -g POWERLEVEL9K_STATUS_ERROR=true # Dur&#233;e de la derni&#232;re commande (n'appara&#238;t que si &gt; 3s) typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3 typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=$bg3 # Heure typeset -g POWERLEVEL9K_TIME_FOREGROUND=$fg0 typeset -g POWERLEVEL9K_TIME_BACKGROUND=$bg1 typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M}' # Caract&#232;re de prompt (&#233;quivalent du [character] Starship) typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=$green typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=$red typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='&#10095;' typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='&#10094;' # R&#233;duit le bruit affich&#233; par le mode &#034;instant prompt&#034; au d&#233;marrage typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true } (( ${#p10k_config_opts} )) &amp;&amp; setopt ${p10k_config_opts[@]} 'builtin' 'unset' 'p10k_config_opts' &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.zsh_plugins.txt&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# Th&#232;me &#8212; doit &#234;tre charg&#233; t&#244;t, avant les autres plugins romkatv/powerlevel10k # ## Using Oh My Zsh plugins # getantidote/use-omz # https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/aliases ohmyzsh/ohmyzsh path:plugins/aliases # https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/fzf ohmyzsh/ohmyzsh path:plugins/fzf # https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git ohmyzsh/ohmyzsh path:plugins/git # https://github.com/unixorn/git-extra-commands?tab=readme-ov-file#antigen unixorn/git-extra-commands # https://github.com/MichaelAquilina/zsh-you-should-use &#034;MichaelAquilina/zsh-you-should-use&#034; # https://github.com/wintermi/zsh-lsd wintermi/zsh-lsd # https://github.com/voronkovich/symfony-complete.plugin.zsh voronkovich/symfony-complete.plugin.zsh # fzf-tab &#8212; remplace le menu de compl&#233;tion standard par une interface fzf. # Doit &#234;tre charg&#233; apr&#232;s compinit (d&#233;j&#224; le cas, compinit tourne en tout # d&#233;but de .zshrc) et AVANT les plugins qui enveloppent les widgets ZLE # ci-dessous. Aloxaf/fzf-tab # Ces trois-l&#224; doivent &#234;tre charg&#233;s en dernier : ils enveloppent les # widgets ZLE d&#233;finis par les plugins pr&#233;c&#233;dents. zdharma-continuum/fast-syntax-highlighting kind:defer zsh-users/zsh-autosuggestions kind:defer zsh-users/zsh-history-substring-search kind:defer &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.config/zellij/config.kdl&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// // THIS FILE WAS AUTOGENERATED BY ZELLIJ, THE PREVIOUS FILE AT THIS LOCATION WAS COPIED TO: /home/bricebou/.config/zellij/config.kdl.bak.1 // keybinds clear-defaults=true { locked { bind &#034;Ctrl g&#034; { SwitchToMode &#034;normal&#034;; } } pane { bind &#034;left&#034; { MoveFocus &#034;left&#034;; } bind &#034;down&#034; { MoveFocus &#034;down&#034;; } bind &#034;up&#034; { MoveFocus &#034;up&#034;; } bind &#034;right&#034; { MoveFocus &#034;right&#034;; } bind &#034;c&#034; { SwitchToMode &#034;renamepane&#034;; PaneNameInput 0; } bind &#034;d&#034; { NewPane &#034;down&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;e&#034; { TogglePaneEmbedOrFloating; SwitchToMode &#034;locked&#034;; } bind &#034;f&#034; { ToggleFocusFullscreen; SwitchToMode &#034;locked&#034;; } bind &#034;h&#034; { MoveFocus &#034;left&#034;; } bind &#034;i&#034; { TogglePanePinned; SwitchToMode &#034;locked&#034;; } bind &#034;j&#034; { MoveFocus &#034;down&#034;; } bind &#034;k&#034; { MoveFocus &#034;up&#034;; } bind &#034;l&#034; { MoveFocus &#034;right&#034;; } bind &#034;n&#034; { NewPane; SwitchToMode &#034;locked&#034;; } bind &#034;p&#034; { SwitchToMode &#034;normal&#034;; } bind &#034;r&#034; { NewPane &#034;right&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;s&#034; { NewPane &#034;stacked&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;w&#034; { ToggleFloatingPanes; SwitchToMode &#034;locked&#034;; } bind &#034;x&#034; { CloseFocus; SwitchToMode &#034;locked&#034;; } bind &#034;z&#034; { TogglePaneFrames; SwitchToMode &#034;locked&#034;; } bind &#034;tab&#034; { SwitchFocus; } } tab { bind &#034;left&#034; { GoToPreviousTab; } bind &#034;down&#034; { GoToNextTab; } bind &#034;up&#034; { GoToPreviousTab; } bind &#034;right&#034; { GoToNextTab; } bind &#034;1&#034; { GoToTab 1; SwitchToMode &#034;locked&#034;; } bind &#034;2&#034; { GoToTab 2; SwitchToMode &#034;locked&#034;; } bind &#034;3&#034; { GoToTab 3; SwitchToMode &#034;locked&#034;; } bind &#034;4&#034; { GoToTab 4; SwitchToMode &#034;locked&#034;; } bind &#034;5&#034; { GoToTab 5; SwitchToMode &#034;locked&#034;; } bind &#034;6&#034; { GoToTab 6; SwitchToMode &#034;locked&#034;; } bind &#034;7&#034; { GoToTab 7; SwitchToMode &#034;locked&#034;; } bind &#034;8&#034; { GoToTab 8; SwitchToMode &#034;locked&#034;; } bind &#034;9&#034; { GoToTab 9; SwitchToMode &#034;locked&#034;; } bind &#034;[&#034; { BreakPaneLeft; SwitchToMode &#034;locked&#034;; } bind &#034;]&#034; { BreakPaneRight; SwitchToMode &#034;locked&#034;; } bind &#034;b&#034; { BreakPane; SwitchToMode &#034;locked&#034;; } bind &#034;h&#034; { GoToPreviousTab; } bind &#034;j&#034; { GoToNextTab; } bind &#034;k&#034; { GoToPreviousTab; } bind &#034;l&#034; { GoToNextTab; } bind &#034;n&#034; { NewTab; SwitchToMode &#034;locked&#034;; } bind &#034;r&#034; { SwitchToMode &#034;renametab&#034;; TabNameInput 0; } bind &#034;s&#034; { ToggleActiveSyncTab; SwitchToMode &#034;locked&#034;; } bind &#034;t&#034; { SwitchToMode &#034;normal&#034;; } bind &#034;x&#034; { CloseTab; SwitchToMode &#034;locked&#034;; } bind &#034;tab&#034; { ToggleTab; } } resize { bind &#034;left&#034; { Resize &#034;Increase left&#034;; } bind &#034;down&#034; { Resize &#034;Increase down&#034;; } bind &#034;up&#034; { Resize &#034;Increase up&#034;; } bind &#034;right&#034; { Resize &#034;Increase right&#034;; } bind &#034;+&#034; { Resize &#034;Increase&#034;; } bind &#034;-&#034; { Resize &#034;Decrease&#034;; } bind &#034;=&#034; { Resize &#034;Increase&#034;; } bind &#034;H&#034; { Resize &#034;Decrease left&#034;; } bind &#034;J&#034; { Resize &#034;Decrease down&#034;; } bind &#034;K&#034; { Resize &#034;Decrease up&#034;; } bind &#034;L&#034; { Resize &#034;Decrease right&#034;; } bind &#034;h&#034; { Resize &#034;Increase left&#034;; } bind &#034;j&#034; { Resize &#034;Increase down&#034;; } bind &#034;k&#034; { Resize &#034;Increase up&#034;; } bind &#034;l&#034; { Resize &#034;Increase right&#034;; } bind &#034;r&#034; { SwitchToMode &#034;normal&#034;; } } move { bind &#034;left&#034; { MovePane &#034;left&#034;; } bind &#034;down&#034; { MovePane &#034;down&#034;; } bind &#034;up&#034; { MovePane &#034;up&#034;; } bind &#034;right&#034; { MovePane &#034;right&#034;; } bind &#034;h&#034; { MovePane &#034;left&#034;; } bind &#034;j&#034; { MovePane &#034;down&#034;; } bind &#034;k&#034; { MovePane &#034;up&#034;; } bind &#034;l&#034; { MovePane &#034;right&#034;; } bind &#034;m&#034; { SwitchToMode &#034;normal&#034;; } bind &#034;n&#034; { MovePane; } bind &#034;p&#034; { MovePaneBackwards; } bind &#034;tab&#034; { MovePane; } } scroll { bind &#034;Alt left&#034; { MoveFocusOrTab &#034;left&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt down&#034; { MoveFocus &#034;down&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt up&#034; { MoveFocus &#034;up&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt right&#034; { MoveFocusOrTab &#034;right&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;e&#034; { EditScrollback; SwitchToMode &#034;locked&#034;; } bind &#034;f&#034; { SwitchToMode &#034;entersearch&#034;; SearchInput 0; } bind &#034;Alt h&#034; { MoveFocusOrTab &#034;left&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt j&#034; { MoveFocus &#034;down&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt k&#034; { MoveFocus &#034;up&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;Alt l&#034; { MoveFocusOrTab &#034;right&#034;; SwitchToMode &#034;locked&#034;; } bind &#034;s&#034; { SwitchToMode &#034;normal&#034;; } } search { bind &#034;c&#034; { SearchToggleOption &#034;CaseSensitivity&#034;; } bind &#034;n&#034; { Search &#034;down&#034;; } bind &#034;o&#034; { SearchToggleOption &#034;WholeWord&#034;; } bind &#034;p&#034; { Search &#034;up&#034;; } bind &#034;w&#034; { SearchToggleOption &#034;Wrap&#034;; } } session { bind &#034;a&#034; { LaunchOrFocusPlugin &#034;zellij:about&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;c&#034; { LaunchOrFocusPlugin &#034;configuration&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;d&#034; { Detach; } bind &#034;l&#034; { LaunchOrFocusPlugin &#034;zellij:layout-manager&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;o&#034; { SwitchToMode &#034;normal&#034;; } bind &#034;p&#034; { LaunchOrFocusPlugin &#034;plugin-manager&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;s&#034; { LaunchOrFocusPlugin &#034;zellij:share&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } bind &#034;w&#034; { LaunchOrFocusPlugin &#034;session-manager&#034; { floating true move_to_focused_tab true } SwitchToMode &#034;locked&#034; } } shared_among &#034;normal&#034; &#034;locked&#034; { bind &#034;Alt left&#034; { MoveFocusOrTab &#034;left&#034;; } bind &#034;Alt down&#034; { MoveFocus &#034;down&#034;; } bind &#034;Alt up&#034; { MoveFocus &#034;up&#034;; } bind &#034;Alt right&#034; { MoveFocusOrTab &#034;right&#034;; } bind &#034;Alt +&#034; { Resize &#034;Increase&#034;; } bind &#034;Alt -&#034; { Resize &#034;Decrease&#034;; } bind &#034;Alt =&#034; { Resize &#034;Increase&#034;; } bind &#034;Alt [&#034; { PreviousSwapLayout; } bind &#034;Alt ]&#034; { NextSwapLayout; } bind &#034;Alt f&#034; { ToggleFloatingPanes; } bind &#034;Alt h&#034; { MoveFocusOrTab &#034;left&#034;; } bind &#034;Alt i&#034; { MoveTab &#034;left&#034;; } bind &#034;Alt j&#034; { MoveFocus &#034;down&#034;; } bind &#034;Alt k&#034; { MoveFocus &#034;up&#034;; } bind &#034;Alt l&#034; { MoveFocusOrTab &#034;right&#034;; } bind &#034;Alt n&#034; { NewPane; } bind &#034;Alt o&#034; { MoveTab &#034;right&#034;; } bind &#034;Alt p&#034; { TogglePaneInGroup; } bind &#034;Alt Shift p&#034; { ToggleGroupMarking; } } shared_except &#034;locked&#034; &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;Ctrl g&#034; { SwitchToMode &#034;locked&#034;; } bind &#034;Ctrl q&#034; { Quit; } } shared_except &#034;locked&#034; &#034;entersearch&#034; { bind &#034;enter&#034; { SwitchToMode &#034;locked&#034;; } } shared_except &#034;locked&#034; &#034;entersearch&#034; &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;esc&#034; { SwitchToMode &#034;locked&#034;; } } shared_except &#034;locked&#034; &#034;entersearch&#034; &#034;renametab&#034; &#034;renamepane&#034; &#034;move&#034; { bind &#034;m&#034; { SwitchToMode &#034;move&#034;; } } shared_except &#034;locked&#034; &#034;entersearch&#034; &#034;search&#034; &#034;renametab&#034; &#034;renamepane&#034; &#034;session&#034; { bind &#034;o&#034; { SwitchToMode &#034;session&#034;; } } shared_except &#034;locked&#034; &#034;tab&#034; &#034;entersearch&#034; &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;t&#034; { SwitchToMode &#034;tab&#034;; } } shared_among &#034;normal&#034; &#034;resize&#034; &#034;tab&#034; &#034;scroll&#034; &#034;prompt&#034; &#034;tmux&#034; { bind &#034;p&#034; { SwitchToMode &#034;pane&#034;; } } shared_among &#034;normal&#034; &#034;resize&#034; &#034;search&#034; &#034;move&#034; &#034;prompt&#034; &#034;tmux&#034; { bind &#034;s&#034; { SwitchToMode &#034;scroll&#034;; } } shared_except &#034;locked&#034; &#034;resize&#034; &#034;pane&#034; &#034;tab&#034; &#034;entersearch&#034; &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;r&#034; { SwitchToMode &#034;resize&#034;; } } shared_among &#034;scroll&#034; &#034;search&#034; { bind &#034;PageDown&#034; { PageScrollDown; } bind &#034;PageUp&#034; { PageScrollUp; } bind &#034;left&#034; { PageScrollUp; } bind &#034;down&#034; { ScrollDown; } bind &#034;up&#034; { ScrollUp; } bind &#034;right&#034; { PageScrollDown; } bind &#034;Ctrl b&#034; { PageScrollUp; } bind &#034;Ctrl c&#034; { ScrollToBottom; SwitchToMode &#034;locked&#034;; } bind &#034;d&#034; { HalfPageScrollDown; } bind &#034;Ctrl f&#034; { PageScrollDown; } bind &#034;h&#034; { PageScrollUp; } bind &#034;j&#034; { ScrollDown; } bind &#034;k&#034; { ScrollUp; } bind &#034;l&#034; { PageScrollDown; } bind &#034;u&#034; { HalfPageScrollUp; } } entersearch { bind &#034;Ctrl c&#034; { SwitchToMode &#034;scroll&#034;; } bind &#034;esc&#034; { SwitchToMode &#034;scroll&#034;; } bind &#034;enter&#034; { SwitchToMode &#034;search&#034;; } } renametab { bind &#034;esc&#034; { UndoRenameTab; SwitchToMode &#034;tab&#034;; } } shared_among &#034;renametab&#034; &#034;renamepane&#034; { bind &#034;Ctrl c&#034; { SwitchToMode &#034;locked&#034;; } } renamepane { bind &#034;esc&#034; { UndoRenamePane; SwitchToMode &#034;pane&#034;; } } } // Plugin aliases - can be used to change the implementation of Zellij // changing these requires a restart to take effect plugins { about location=&#034;zellij:about&#034; compact-bar location=&#034;zellij:compact-bar&#034; configuration location=&#034;zellij:configuration&#034; filepicker location=&#034;zellij:strider&#034; { cwd &#034;/&#034; } plugin-manager location=&#034;zellij:plugin-manager&#034; session-manager location=&#034;zellij:session-manager&#034; status-bar location=&#034;zellij:status-bar&#034; strider location=&#034;zellij:strider&#034; tab-bar location=&#034;zellij:tab-bar&#034; welcome-screen location=&#034;zellij:session-manager&#034; { welcome_screen true } } // Plugins to load in the background when a new session starts // eg. &#034;file:/path/to/my-plugin.wasm&#034; // eg. &#034;https://example.com/my-plugin.wasm&#034; load_plugins { zellij:link } web_client { font &#034;monospace&#034; } // Use a simplified UI without special fonts (arrow glyphs) // Options: // - true // - false (Default) // // simplified_ui true // Enable OSC8 hyperlink output // Options: // - true (Default) // - false // // osc8_hyperlinks true // Choose the theme that is specified in the themes section. // Default: default // theme &#034;gruber-darker&#034; // Theme to use when the host terminal reports a dark color palette. // Requires `theme_light` to also be set; otherwise `theme` is used. // // theme_dark &#034;dracula&#034; // Theme to use when the host terminal reports a light color palette. // Requires `theme_dark` to also be set; otherwise `theme` is used. // // theme_light &#034;solarized-light&#034; // Choose the base input mode of zellij. // Default: normal // default_mode &#034;locked&#034; // Choose the path to the default shell that zellij will use for opening new panes // Default: $SHELL // // default_shell &#034;fish&#034; // Choose the path to override cwd that zellij will use for opening new panes // // default_cwd &#034;/tmp&#034; // The name of the default layout to load on startup // Default: &#034;default&#034; // // default_layout &#034;compact&#034; // The folder in which Zellij will look for layouts // (Requires restart) // // layout_dir &#034;/tmp&#034; // The folder in which Zellij will look for themes // (Requires restart) // // theme_dir &#034;/tmp&#034; // Toggle enabling the mouse mode. // On certain configurations, or terminals this could // potentially interfere with copying text. // Options: // - true (default) // - false // // mouse_mode false // Toggle having pane frames around the panes // Options: // - true (default, enabled) // - false // // pane_frames false // When attaching to an existing session with other users, // should the session be mirrored (true) // or should each user have their own cursor (false) // (Requires restart) // Default: false // // mirror_session true // Choose what to do when zellij receives SIGTERM, SIGINT, SIGQUIT or SIGHUP // eg. when terminal window with an active zellij session is closed // (Requires restart) // Options: // - detach (Default) // - quit // on_force_close &#034;quit&#034; // Configure the scroll back buffer size // This is the number of lines zellij stores for each pane in the scroll back // buffer. Excess number of lines are discarded in a FIFO fashion. // (Requires restart) // Valid values: positive integers // Default value: 10000 // // scroll_buffer_size 10000 // Provide a command to execute when copying text. The text will be piped to // the stdin of the program to perform the copy. This can be used with // terminal emulators which do not support the OSC 52 ANSI control sequence // that will be used by default if this option is not set. // Examples: // // copy_command &#034;xclip -selection clipboard&#034; // x11 // copy_command &#034;wl-copy&#034; // wayland // copy_command &#034;pbcopy&#034; // osx // // copy_command &#034;pbcopy&#034; // Choose the destination for copied text // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. // Does not apply when using copy_command. // Options: // - system (default) // - primary // // copy_clipboard &#034;primary&#034; // Enable automatic copying (and clearing) of selection when releasing mouse // Default: true // // copy_on_select true // Path to the default editor to use to edit pane scrollbuffer // Default: $EDITOR or $VISUAL // scrollback_editor &#034;/usr/bin/vim&#034; // A fixed name to always give the Zellij session. // Consider also setting `attach_to_session true,` // otherwise this will error if such a session exists. // Default: &lt;RANDOM&gt; // // session_name &#034;My singleton session&#034; // When `session_name` is provided, attaches to that session // if it is already running or creates it otherwise. // Default: false // // attach_to_session true // Toggle between having Zellij lay out panes according to a predefined set of layouts whenever possible // Options: // - true (default) // - false // // auto_layout false // Whether sessions should be serialized to the cache folder (including their tabs/panes, cwds and running commands) so that they can later be resurrected // Options: // - true (default) // - false // // session_serialization false // Whether pane viewports are serialized along with the session, default is false // Options: // - true // - false (default) // // serialize_pane_viewport false // Scrollback lines to serialize along with the pane viewport when serializing sessions, 0 // defaults to the scrollback size. If this number is higher than the scrollback size, it will // also default to the scrollback size. This does nothing if `serialize_pane_viewport` is not true. // // scrollback_lines_to_serialize 10000 // Enable or disable the rendering of styled and colored underlines (undercurl). // May need to be disabled for certain unsupported terminals // (Requires restart) // Default: true // // styled_underlines false // How often in seconds sessions are serialized // // serialization_interval 10000 // Enable or disable writing of session metadata to disk (if disabled, other sessions might not know // metadata info on this session) // (Requires restart) // Default: false // // disable_session_metadata false // Enable or disable support for the enhanced Kitty Keyboard Protocol (the host terminal must also support it) // (Requires restart) // Default: true (if the host terminal supports it) // support_kitty_keyboard_protocol false // Whether to make sure a local web server is running when a new Zellij session starts. // This web server will allow creating new sessions and attaching to existing ones that have // opted in to being shared in the browser. // When enabled, navigate to http://127.0.0.1:8082 // (Requires restart) // // Note: a local web server can still be manually started from within a Zellij session or from the CLI. // If this is not desired, one can use a version of Zellij compiled without // `web_server_capability` // // Possible values: // - true // - false // Default: false // // web_server false // Whether to allow sessions started in the terminal to be shared through a local web server, assuming one is // running (see the `web_server` option for more details). // (Requires restart) // // Note: This is an administrative separation and not intended as a security measure. // // Possible values: // - &#034;on&#034; (allow web sharing through the local web server if it // is online) // - &#034;off&#034; (do not allow web sharing unless sessions explicitly opt-in to it) // - &#034;disabled&#034; (do not allow web sharing and do not permit sessions started in the terminal to opt-in to it) // Default: &#034;off&#034; // // web_sharing &#034;off&#034; // A path to a certificate file to be used when setting up the web client to serve the // connection over HTTPs // // web_server_cert &#034;/path/to/cert.pem&#034; // A path to a key file to be used when setting up the web client to serve the // connection over HTTPs // // web_server_key &#034;/path/to/key.pem&#034; /// Whether to enforce https connections to the web server when it is bound to localhost /// (127.0.0.0/8) /// /// Note: https is ALWAYS enforced when bound to non-local interfaces /// /// Default: false // // enforce_https_for_localhost false // Whether to stack panes when resizing beyond a certain size // Default: true // // stacked_resize false // Whether to show tips on startup // Default: true // show_startup_tips false // Whether to show release notes on first version run // Default: true // // show_release_notes false // Whether to enable mouse hover effects and pane grouping functionality // default is true // advanced_mouse_actions false // Whether to enable mouse hover visual effects (frame highlight and help text) // default is true // mouse_hover_effects false // Whether to show visual bell indicators (pane/tab frame flash and [!] suffix) // default is true // visual_bell true // Whether to focus panes on mouse hover // default is false // focus_follows_mouse false // Whether clicking a pane to focus it also sends the click into the pane // default is false // mouse_click_through false // The ip address the web server should listen on when it starts // Default: &#034;127.0.0.1&#034; // (Requires restart) // web_server_ip &#034;127.0.0.1&#034; // The port the web server should listen on when it starts // Default: 8082 // (Requires restart) // web_server_port 8082 // A command to run (will be wrapped with sh -c and provided the RESURRECT_COMMAND env variable) // after Zellij attempts to discover a command inside a pane when resurrecting sessions, the STDOUT // of this command will be used instead of the discovered RESURRECT_COMMAND // can be useful for removing wrappers around commands // Note: be sure to escape backslashes and similar characters properly // post_command_discovery_hook &#034;echo $RESURRECT_COMMAND | sed &lt;your_regex_here&gt;&#034; // Number of async worker tasks to spawn per active client. // // Allocating few tasks may result in resource contention and lags. Small values (around 4) should // typically work best. Set to 0 to use the number of (physical) CPU cores. // Note: This only applies to web clients at the moment. // client_async_worker_tasks 4 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.config/alacritty/alacritty.toml&lt;/code&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[font] size=9.5 [terminal.shell] program = &#034;/usr/bin/zellij&#034; args = [&#034;attach&#034;, &#034;-c&#034;, &#034;main&#034;] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Eclipse&#160;: bulles contextuelles hors de l'&#233;cran</title>
		<link>https://www.momh.fr/eclipse-bulles-contextuelles-hors-de-l-ecran</link>
		<guid isPermaLink="true">https://www.momh.fr/eclipse-bulles-contextuelles-hors-de-l-ecran</guid>
		<dc:date>2022-10-12T12:13:35Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Sous Gnome Shell dans sa version 42, sous Wayland, les bulles contextuelles d'Eclipse affichant la JavaDoc associ&#233;e aux m&#233;thodes sugg&#233;r&#233;es lors de la saisie d&#233;passent de l'&#233;cran... &lt;br class='autobr' /&gt; La chose n'est pas extr&#234;mement simple &#224; d&#233;crire et les recherches sont de fait relativement d&#233;licates &#224; mener... Plut&#244;t qu'un long discours, voici une capture d'&#233;cran pr&#233;sentant le souci&#160;: &lt;br class='autobr' /&gt;
Retrouver un Eclipse utilisable &lt;br class='autobr' /&gt;
Je ne saurais expliquer trop pr&#233;cis&#233;ment mais la solution consiste &#224; lancer Eclipse en&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Sous Gnome Shell dans sa version 42, sous Wayland, les bulles contextuelles d'Eclipse affichant la JavaDoc associ&#233;e aux m&#233;thodes sugg&#233;r&#233;es lors de la saisie d&#233;passent de l'&#233;cran...&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;La chose n'est pas extr&#234;mement simple &#224; d&#233;crire et les recherches sont de fait relativement d&#233;licates &#224; mener... Plut&#244;t qu'un long discours, voici une capture d'&#233;cran pr&#233;sentant le souci&#160;:&lt;/p&gt;
&lt;div class='spip_document_116 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;22&#034; data-legende-lenx=&#034;&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_wayland.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH269/eclipse_wayland-6a06e.png?1788280308' width='500' height='269' alt='La bulle de JavaDoc d'Eclipse sous Wayland d&#233;borde de l'&#233;cran.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Eclipse sous Wayland
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Retrouver un Eclipse utilisable&lt;/h2&gt;
&lt;p&gt;Je ne saurais expliquer trop pr&#233;cis&#233;ment mais la solution consiste &#224; lancer Eclipse en utilisant X11 comme backend&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; dans un terminal, il suffit de lancer la commande suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;export GDK_BACKEND=x11; eclipse &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et vous devriez alors non seulement retrouver vos bulles contextuelles correctement positionn&#233;es mais aussi pouvoir utiliser v&#233;ritablement les fen&#234;tres de cr&#233;ation de projet, de g&#233;n&#233;ration de constructeurs ou d'accesseurs... puisqu'elles prennent alors toute la hauteur de l'&#233;cran et n'en d&#233;bordent pas. Ce qu'illustrent les deux captures ci-dessous.&lt;/p&gt;
&lt;div class='spip_document_115 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;32&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_x11.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH281/eclipse_x11-940e9.png?1788280308' width='500' height='281' alt='Les bulles contextuelles sont alors correctement positionn&#233;es dans la fen&#234;tre et ne d&#233;bordent plus de l'&#233;cran.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Eclipse avec X11 comme backend
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&#8203;&lt;/p&gt;
&lt;div class='spip_document_117 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende' data-legende-len=&#034;44&#034; data-legende-lenx=&#034;x&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/eclipse_project.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH281/eclipse_project-6d7cc.png?1788280308' width='500' height='281' alt='Avec le backend GTK X11, la fen&#234;tre appara&#238;t dans toute sa hauteur, les boutons d'actions sont visibles et utilisables.' /&gt;&lt;/a&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_titre '&gt;&lt;strong&gt;Fen&#234;tre de cr&#233;ation de projet sous Eclipse
&lt;/strong&gt;&lt;/div&gt; &lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Lanceur&lt;/h2&gt;
&lt;p&gt;&#8203;&lt;br class='autobr' /&gt;
J'avais install&#233; Eclipse via Snap&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; pour modifier le lanceur, il convient tout d'abord de copier le lanceur original dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.local/share/applications&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo cp /var/lib/snapd/desktop/applications/eclipse_eclipse.desktop ~/.local/share/applications &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et de modifier la ligne Exec de ce nouveau fichier, afin qu'il ressemble au final &#224; ceci&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[Desktop Entry] X-SnapInstanceName=eclipse Version=1.0 Type=Application Name=Eclipse (X11) Icon=/snap/eclipse/61/icon.xpm Exec=env GDK_BACKEND=x11 /snap/bin/eclipse %f Comment=Eclipse IDE Categories=Development;IDE; Terminal=false StartupWMClass=eclipse &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;&lt;br class='autobr' /&gt;
Il se peut que vous ayez &#224; fermer et r&#233;ouvrir votre session pour que le lanceur soit mis &#224; jour.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Faire cohabiter plusieurs versions de PHP sous Debian</title>
		<link>https://www.momh.fr/faire-cohabiter-plusieurs-versions-de-php-sous-debian</link>
		<guid isPermaLink="true">https://www.momh.fr/faire-cohabiter-plusieurs-versions-de-php-sous-debian</guid>
		<dc:date>2022-03-12T17:58:39Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>
		<dc:subject>webdev</dc:subject>

		<description>
&lt;p&gt;Surtout par curiosit&#233;, je me suis pench&#233; sur la possibilit&#233; de faire cohabiter plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; sur ma Debian Bullseye et surtout sur la fa&#231;on de basculer ais&#233;ment de l'une &#224; l'autre. &lt;br class='autobr' /&gt; Installation &lt;br class='autobr' /&gt;
Pour installer plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; conjointement, il faut ajouter le d&#233;p&#244;t Sury&#160;: bash sudo apt update sudo apt -y install apt-transport-https lsb-release ca-certificates curl sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg sudo sh&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Surtout par curiosit&#233;, je me suis pench&#233; sur la possibilit&#233; de faire cohabiter plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; sur ma Debian Bullseye et surtout sur la fa&#231;on de basculer ais&#233;ment de l'une &#224; l'autre.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Pour installer plusieurs versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; conjointement, il faut ajouter &lt;a href=&#034;https://deb.sury.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;le d&#233;p&#244;t Sury&lt;/a&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt update sudo apt -y install apt-transport-https lsb-release ca-certificates curl sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg sudo sh -c 'echo &#034;deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main&#034; &gt; /etc/apt/sources.list.d/php.list' sudo apt update &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De l&#224;, il est possible d'installer diverses versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; et de ses modules&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; ainsi, sous Bullseye, je me vois proposer les versions 5.6, 7.0, 7.1, 7.2, 7.3, 7.4, 8.0 et 8.1&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;apt search php | grep &#034;php[0-9]\.[0-9]/&#034; [...] php5.6/bullseye 5.6.40-57+0~20211119.60+debian11~1.gbp8a9bd1 all php7.0/bullseye 7.0.33-57+0~20211119.61+debian11~1.gbp5d8ba5 all php7.1/bullseye 7.1.33-44+0~20211119.61+debian11~1.gbp448fbe all php7.2/bullseye 7.2.34-28+0~20211119.67+debian11~1.gbpf24e81 all php7.3/bullseye 7.3.33-1+0~20211119.91+debian11~1.gbp618351 all php7.4/stable-security,now 7.4.28-1+deb11u1 all [install&#233;, pouvant &#234;tre supprim&#233; automatiquement] php8.0/bullseye 8.0.16-1+0~20220221.30+debian11~1.gbp8b91a5 all php8.1/bullseye,now 8.1.3-1+0~20220223.13+debian11~1.gbp7757b9 all [install&#233;, automatique] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Changer facilement de version de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Afin de faciliter le basculement d'une version &#224; une autre, j'ai compil&#233; diff&#233;rentes sources pour finalement produire un petit script, tr&#232;s certainement imparfait, qui permet de choisir de mani&#232;re interactive parmi les versions de &lt;span class=&#034;caps&#034;&gt;PHP&lt;/span&gt; install&#233;es celle &#224; utiliser.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;touch ~/bin/php-switch chmod +x ~/bin/php-switch nano ~/bin/php-switch &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#!/bin/bash # based on https://askubuntu.com/a/883140 # and on https://stackoverflow.com/a/68905711 # D&#233;terminer la version de PHP actuellement utilis&#233;e par Apache VAR=$(ls /etc/apache2/mods-enabled/php*) IFS=' ' read -r -a array &lt;&lt;&lt; &#034;$VAR&#034; array[0]=${array[0]#*php} array[0]=${array[0]%.conf} OLDVERSION=${array[0]} echo &#034;La version de PHP actuellement utilis&#233;e est la&#034; $OLDVERSION. echo &#034;Liste des versions de PHP disponibles :&#034; # Lister les versions de PHP install&#233;es RAWPOSSIBILITIES=$(update-alternatives --list php | sed 's/.*\(...\)/\1/') POSSIBILITIES=($RAWPOSSIBILITIES) # Demander la version de PHP &#224; activer PS3='Choisissez la version de PHP &#224; activer : ' select opt in &#034;${POSSIBILITIES[@]}&#034; &#034;Annuler&#034;; do case &#034;$REPLY&#034; in $((${#POSSIBILITIES[@]}+1))) echo &#034;Salut!&#034;; exit;; esac [ $REPLY -gt $((${#POSSIBILITIES[@]}+1)) -o $REPLY -lt 1 ] &amp;&amp; echo &#034;Choix invalide&#034; || break done echo &#034;Activer la version ${POSSIBILITIES[(($REPLY-1))]} ? Entr&#233;e pour valider, Ctrl-C pour annuler.&#034; read x # On reconfigure Apache sudo a2dismod php${OLDVERSION} sudo a2enmod php${POSSIBILITIES[(($REPLY-1))]} # On met &#224; jour la version par d&#233;faut sudo update-alternatives --set php /usr/bin/php${POSSIBILITIES[(($REPLY-1))]} sudo update-alternatives --set phar /usr/bin/phar${POSSIBILITIES[(($REPLY-1))]} sudo update-alternatives --set phar.phar /usr/bin/phar.phar${POSSIBILITIES[(($REPLY-1))]} # On relance le service Apache sudo systemctl restart apache2 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#8203;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Node.js et autocompl&#233;tion avec Tmux</title>
		<link>https://www.momh.fr/node-js-et-autocompletion-avec-tmux</link>
		<guid isPermaLink="true">https://www.momh.fr/node-js-et-autocompletion-avec-tmux</guid>
		<dc:date>2022-02-22T21:12:10Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>webdev</dc:subject>
		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Si je b&#233;n&#233;ficiais parfaitement de l'autocompl&#233;tion des commandes fournies par node.js dans mon terminal classique, celle-ci ne fonctionnait plus sous Tmux&#160;: une sombre histoire de diff&#233;rence entre interactive shell et login shell. &lt;br class='autobr' /&gt; Mon .bashrc contenait pourtant bien le code n&#233;cessaire mais, au-del&#224; de l'autocompl&#233;tion de node.js, il ne semblait pas du tout &#234;tre lu, puisque m&#234;me mon invite de commande ne correspondait pas &#224; celle configur&#233;e... &lt;br class='autobr' /&gt;
Cependant, mes recherches se focalisaient&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/webdev" rel="tag"&gt;webdev&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Si je b&#233;n&#233;ficiais parfaitement de l'autocompl&#233;tion des commandes fournies par node.js dans mon terminal classique, celle-ci ne fonctionnait plus sous Tmux&#160;: une sombre histoire de diff&#233;rence entre &lt;i&gt;interactive&lt;/i&gt; shell et &lt;i&gt;login&lt;/i&gt; shell.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Mon &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;.bashrc&lt;/code&gt; contenait pourtant bien le code n&#233;cessaire mais, au-del&#224; de l'autocompl&#233;tion de node.js, il ne semblait pas du tout &#234;tre lu, puisque m&#234;me mon invite de commande ne correspondait pas &#224; celle configur&#233;e...&lt;/p&gt;
&lt;p&gt;Cependant, mes recherches se focalisaient sur le probl&#232;me de l'autocompl&#233;tion de node.js et ne me fournissaient gu&#232;re de solution... C'est en changeant de perspective que je suis tomb&#233; sur &lt;a href=&#034;https://unix.stackexchange.com/questions/320465/new-tmux-sessions-do-not-source-bashrc-file&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;le sujet &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;New tmux sessions do not source bashrc file&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; sur Stack Exchange&lt;/a&gt; et surtout sur &lt;a href=&#034;https://unix.stackexchange.com/a/541352&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la r&#233;ponse tr&#232;s compl&#232;te de Simba&lt;/a&gt; qui pr&#233;sente donc la diff&#233;rence entre les &lt;i&gt;interactiven non-login shells&lt;/i&gt; &#8212; qui sourcent le fichier .bashrc &#8212; et les &lt;i&gt;login shells&lt;/i&gt; &#8212; qui sourcent quant &#224; eux les fichiers .profile et .bash_profile notamment.&lt;/p&gt;
&lt;p&gt;Deux solutions sont alors possibles&#160;:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; soit on &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;source&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; le fichier .bashrc depuis l'un de ces deux derniers fichiers &#8212; cette solution &#233;tant celle que recommande Simba justement&#160;:
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# if running bash if [ -n &#034;$BASH_VERSION&#034; ]; then # include .bashrc if it exists if [ -f &#034;$HOME/.bashrc&#034; ]; then . &#034;$HOME/.bashrc&#034; fi fi &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt; soit on &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;int&#232;gre&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; l'autocompl&#233;tion de node.js dans le fichier .profile avec la simple commande&#160;:
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;npm completion &gt;&gt; ~/.profile &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>T&#233;l&#233;charger ses s&#233;ries avec Flexget</title>
		<link>https://www.momh.fr/telecharger-ses-series-avec-flexget</link>
		<guid isPermaLink="true">https://www.momh.fr/telecharger-ses-series-avec-flexget</guid>
		<dc:date>2021-08-21T05:22:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>
		<dc:subject>Raspberry Pi</dc:subject>
		<dc:subject>torrent</dc:subject>

		<description>
&lt;p&gt;Cela fait quelques ann&#233;es que j'utilise Flexget &#8212; relativement basiquement &#8212; pour t&#233;l&#233;charger automatiquement les &#233;pisodes des s&#233;ries que je suis mais ce n'est que depuis r&#233;cemment que je suis parvenu &#224; une configuration pleinement satisfaisante. &lt;br class='autobr' /&gt; Flexget est un outil d'automation pour m&#233;dias, notamment pour s&#233;ries et animes, permettant entre autres de t&#233;l&#233;charger et d'organiser les &#233;pisodes... Je ne pr&#233;tends pas ici pr&#233;senter l'outil dans ses moindre d&#233;tails mais simplement pr&#233;senter la&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/raspberry-pi" rel="tag"&gt;Raspberry Pi&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/torrent" rel="tag"&gt;torrent&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Cela fait quelques ann&#233;es que j'utilise Flexget &#8212; relativement basiquement &#8212; pour t&#233;l&#233;charger automatiquement les &#233;pisodes des s&#233;ries que je suis mais ce n'est que depuis r&#233;cemment que je suis parvenu &#224; une configuration pleinement satisfaisante.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;a href=&#034;https://flexget.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Flexget&lt;/a&gt; est un outil d'automation pour m&#233;dias, notamment pour s&#233;ries et animes, permettant entre autres de t&#233;l&#233;charger et d'organiser les &#233;pisodes...&lt;br class='autobr' /&gt;
Je ne pr&#233;tends pas ici pr&#233;senter l'outil dans ses moindre d&#233;tails mais simplement pr&#233;senter la configuration utilis&#233;e sur mon Raspberry Pi qui envoie les torrents &#224; un &lt;i&gt;daemon&lt;/i&gt; Transmission qui tourne sur mon &lt;span class=&#034;caps&#034;&gt;NAS&lt;/span&gt; D-Link &lt;span class=&#034;caps&#034;&gt;DNS&lt;/span&gt;-320 avec fun_plug (cf. &lt;a href='https://www.momh.fr/spip.php?page=article&amp;id_article=47'&gt;cet article&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Pour l'installation, on choisit l'option &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;virtualenv&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de &lt;a href=&#034;https://flexget.com/InstallWizard/Linux&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la documentation&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;python3 -m venv ~/flexget/ cd ~/flexget/ bin/pip install flexget &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cependant, si vous souhaitez utiliser le plugin Transmission de Flexget, il vous faudra installer le paquet &lt;i&gt;transmission-rpc&lt;/i&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;bin/pip install transmission-rpc&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;sinon vos logs (dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/flexget/flexget.log&lt;/code&gt;) vous afficheront des lignes de ce type&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;2021-10-29 09:09:48 WARNING task feed-eztv Aborting task (plugin: transmission) 2021-10-29 09:09:51 CRITICAL transmission feed-rarbg transmission-rpc module version 3.0 or higher required. &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La configuration de FlexGet se fait dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;~/.config/flexget/config.yml&lt;/code&gt; et n&#233;cessite de pr&#234;ter une attention toute particuli&#232;re aux indentations...&lt;/p&gt;
&lt;p&gt;Sans entrer dans le d&#233;tail&#160;: on se connecte &#224; une instance de Transmission, on d&#233;finit les crit&#232;res de t&#233;l&#233;chargement des torrents des s&#233;ries que l'on suit (depuis le site &lt;a href=&#034;https://www.pogdesign.co.uk/cat/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span class=&#034;caps&#034;&gt;TV&lt;/span&gt; Calendar&lt;/a&gt;) en rejetant les s&#233;ries issues de certains &lt;i&gt;networks&lt;/i&gt; et on envoie un mail pour annoncer les &#233;pisodes t&#233;l&#233;charg&#233;s.&lt;br class='autobr' /&gt;
Et ce pour deux flux &lt;span class=&#034;caps&#034;&gt;RSS&lt;/span&gt; diff&#233;rents, chacun faisant l'objet d'une t&#226;che que l'on lance automatiquement toutes les heures.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;yaml&#034; class='spip_code spip_code_block language-yaml' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;templates: tv: transmission: host: 192.168.X.XX port: 9091 # username: username # password: password configure_series: settings: timeframe: 12 hours target: 1080p quality: 720p-1080p propers: 3 days from: pogcal: username: azerty@uiop.fr password: XXXXX thetvdb_lookup: yes if: - &#034;tvdb_network and tvdb_network=='Netflix'&#034;: reject - &#034;tvdb_network and tvdb_network=='Amazon'&#034;: reject notify: task: template: html # Optional, if you want html instead of plain text via: - email: from: azerty@uiop.fr to: - azerty@uiop.fr - qwerty@uiop.com smtp_host: smpt.host.com smtp_port: 587 smtp_username: azerty@uiop.fr smtp_password: &#034;XXXXXX&#034; smtp_tls: yes html: yes # To parse template as HTML tasks: feed-eztv: priority: 1 template: tv rss: https://eztv.re/ezrss.xml feed-rarbg: priority: 2 template: tv rss: http://rarbg.to/rssdd.php?categories=2;18;41;49 schedules: - tasks: '*' interval: hours: 1 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'id&#233;e est donc de faire tourner FlexGet en mode &lt;i&gt;daemon&lt;/i&gt; et de lui faire d&#233;clencher des t&#226;ches r&#233;guli&#232;rement (la section &lt;i&gt;schedules&lt;/i&gt; en toute fin de fichier). Pour ce faire, on le lance ainsi&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;~/flexget/bin/flexget --loglevel VERBOSE daemon start --autoreload-config -d &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour que FlexGet se lance automatiquement &#224; chaque d&#233;marrage, on cr&#233;e une t&#226;che Cron gr&#226;ce &#224; la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;crontab -e&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;@reboot /home/pi/flexget/bin/flexget --loglevel VERBOSE daemon start --autoreload-config -d &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Scanner Epson WF-2865 en WiFi sous Debian/Raspbian</title>
		<link>https://www.momh.fr/scanner-epson-wf-2865-en-wifi-sous-debian-raspbian</link>
		<guid isPermaLink="true">https://www.momh.fr/scanner-epson-wf-2865-en-wifi-sous-debian-raspbian</guid>
		<dc:date>2021-02-27T15:03:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Si l'imprimante de mon multifonction Epson WorkForce &lt;span class=&#034;caps&#034;&gt;WF&lt;/span&gt;-2865 connect&#233; en WiFi ne m'a gu&#232;re pos&#233; probl&#232;me, l'utilisation du scanner a &#233;t&#233; plus d&#233;licate... &lt;br class='autobr' /&gt; On commence par installer sane&#160;: bash sudo apt install sane sane-utils &lt;br class='autobr' /&gt;
On &#233;dite le fichier /etc/sane.d/dll.conf&#160;: bash sudo nano /etc/sane.d/dll.conf &lt;br class='autobr' /&gt;
et on d&#233;commente la ligne du pilote epson2. &lt;br class='autobr' /&gt;
Pour l'&#233;tape suivante, on va avoir besoin de conna&#238;tre l'adresse de notre imprimante au sein de notre r&#233;seau&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; pour ce faire, on utilise&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Si l'imprimante de mon multifonction Epson WorkForce &lt;span class=&#034;caps&#034;&gt;WF&lt;/span&gt;-2865 connect&#233; en WiFi ne m'a gu&#232;re pos&#233; probl&#232;me, l'utilisation du scanner a &#233;t&#233; plus d&#233;licate...&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;On commence par installer &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sane&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install sane sane-utils &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On &#233;dite le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/sane.d/dll.conf&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/sane.d/dll.conf &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et on d&#233;commente la ligne du pilote &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;epson2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour l'&#233;tape suivante, on va avoir besoin de conna&#238;tre l'adresse de notre imprimante au sein de notre r&#233;seau&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; pour ce faire, on utilise l'utilitaire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;nmap&lt;/code&gt; qu'il convient d'installer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install nmap &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut ensuite, pour effectuer un scan rapide, lancer la commande suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nmap -sn 192.168.1.0/24 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et on obtient, entre autres&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[...] Nmap scan report for 192.168.1.12 Host is up (-0.17s latency). MAC Address: 38:9D:92:29:1C:FC (Seiko Epson) [...] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nous pouvons d&#233;sormais &#233;diter le ficier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/sane.d/epson2.conf&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/sane.d/epson2.conf &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;en modifiant la fin du fichier de la sorte&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#net autodiscovery net 192.168.1.12 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On se rend ensuite sur le site d'&lt;a href=&#034;https://support.epson.net/linux/en/imagescanv3.php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Epson&lt;/a&gt; pour r&#233;cup&#233;rer le logiciel ImageScan ainsi que les pilotes pour notre architecture.&lt;/p&gt;
&lt;p&gt;Par exemple&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget https://download2.ebz.epson.net/imagescanv3/common/deb/arm/imagescan-bundle-common-3.65.0.arm.deb.tar.gz tar xvzf imagescan-bundle-common-3.65.0.arm.deb.tar.gz cd imagescan-bundle-common-3.65.0.arm.deb/ sudo ./install.sh &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On ouvre ensuite le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/imagescan/imagescan.conf&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/imagescan/imagescan.conf &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et on le modifie pour obtenir cela&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[devices] myscanner.udi = esci:networkscan://192.168.1.12:1865 myscanner.vendor = Epson myscanner.model = WF2865 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;D&#233;sormais vous devriez voir votre scanner dans Imagescan et sane (et tous les logiciels qui s'appuient sur lui tels xsane ou Gimp) devrait trouver votre p&#233;riph&#233;rique sans soucis&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;!&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>WeeWX, MQTT et skin Belchertown</title>
		<link>https://www.momh.fr/weewx-mqtt-et-skin-belchertown</link>
		<guid isPermaLink="true">https://www.momh.fr/weewx-mqtt-et-skin-belchertown</guid>
		<dc:date>2020-12-20T15:14:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>
		<dc:subject>Raspberry Pi</dc:subject>
		<dc:subject>WeeWX</dc:subject>

		<description>
&lt;p&gt;Le skin Belchertown pour WeeWX propos&#233; par Pat O'Brien est extr&#234;mement complet (et complexe, du moins pour moi) et est particuli&#232;rement int&#233;ressant pour ses graphiques dynamiques en JavaScript. &lt;br class='autobr' /&gt; Installation et configuration de base &lt;br class='autobr' /&gt;
Son installation n'est pas particuli&#232;rement difficile puisqu'il suffit de suivre les instructions fournies&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; ainsi, &#224; ce jour&#160;: bash wget https://github.com/poblabs/weewx-belchertown/releases/download/weewx-belchertown-1.2/weewx-belchertown-release-1.2.tar.gz&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/raspberry-pi" rel="tag"&gt;Raspberry Pi&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/weewx" rel="tag"&gt;WeeWX&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Le &lt;a href=&#034;https://github.com/poblabs/weewx-belchertown&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;skin Belchertown&lt;/a&gt; pour WeeWX propos&#233; par Pat O'Brien est extr&#234;mement complet (et complexe, du moins pour moi) et est particuli&#232;rement int&#233;ressant pour ses graphiques dynamiques en JavaScript.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Installation et configuration de base&lt;/h2&gt;
&lt;p&gt;Son installation n'est pas particuli&#232;rement difficile puisqu'il suffit de suivre les instructions fournies&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; ainsi, &#224; ce jour&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget https://github.com/poblabs/weewx-belchertown/releases/download/weewx-belchertown-1.2/weewx-belchertown-release-1.2.tar.gz sudo wee_extension --install weewx-belchertown-release-1.2.tar.gz &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, il convient de passer &#224; sa configuration en ayant pris soin, afin de b&#233;n&#233;ficier de certaines options dont le module de pr&#233;visions &#224; sept jours, de &lt;a href=&#034;https://github.com/poblabs/weewx-belchertown#requirements&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;remplir certaines conditions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La configuration de base est la suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo nano /etc/weewx/weewx.conf &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[StdReport] ... [[Belchertown]] skin = Belchertown HTML_ROOT = /var/www/html/weewx/ &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;&lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Nous allons surtout nous int&#233;resser &#224; la mise en place du rafra&#238;chissement automatique des graphiques et de l'affichage des donn&#233;es permises par ce skin gr&#226;ce au protocole &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt; (Message Queuing Telemetry Transport). Il convient d'abord d'installer et de configurer un &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;serveur&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187;, un &lt;i&gt;broker&lt;/i&gt;, en l'occurrence &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mosquitto&lt;/code&gt; tel que nous l'avons vu dans &lt;a href='https://www.momh.fr/mosquitto-un-broker-mqtt' class=&#034;spip_in&#034;&gt;un pr&#233;c&#233;dent article&lt;/a&gt; &#224; partir du post de Pat O'Brien &lt;a href=&#034;https://obrienlabs.net/how-to-setup-your-own-mqtt-broker/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;sur son blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bien s&#251;r, dans mon cas, WeeWX ne r&#233;cup&#233;rant des donn&#233;es de la station m&#233;t&#233;o que toutes les cinq voire dix minutes, l'utilisation du plugin weewx-mqtt ne se justifie pas forc&#233;ment...&lt;/p&gt;
&lt;p&gt;Une fois le &lt;i&gt;broker&lt;/i&gt; Mosquitto install&#233; et configur&#233;, il faut installer le plugin &lt;a href=&#034;https://github.com/matthewwall/weewx-mqtt&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;weewx-mqtt&lt;/a&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo pip3 install paho-mqtt wget -O weewx-mqtt.zip https://github.com/matthewwall/weewx-mqtt/archive/master.zip wee_extension --install weewx-mqtt.zip &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On modifie ensuite sa configuration qui d&#233;pend de la section [Restful] dans le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/weewx/weewx.conf&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[Restful] ... [[MQTT]] server_url = mqtt://USER:PASSWORD@SERVER:PORT/ topic = weewx unit_system = METRIC binding = archive, loop aggregation = aggregate [[[tls]]] tls_version = tlsv12 ca_certs = /etc/ssl/certs/ca-certificates.crt &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On en profite pour &#233;diter la configuration du skin Belchertown de la sorte&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;[StdReport] ... [[Belchertown]] skin = Belchertown HTML_ROOT = /var/www/html/weewx/ mqtt_websockets_enabled = 1 mqtt_websockets_host = &#034;SERVER&#034; mqtt_websockets_port = 9001 mqtt_websockets_ssl = 1 mqtt_websockets_topic = &#034;weather/loop&#034; disconnect_live_website_visitor = 1800000 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il ne nous reste plus qu'&#224; relancer weewx&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo service restart weewx &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut v&#233;rifier le bon fonctionnement du plugin weewx-mqtt en lan&#231;ant la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mosquitto_sub&lt;/code&gt; pour suivre le topic &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;weewx/loop&lt;/code&gt; ou en &#233;pluchant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/var/log/syslog&lt;/code&gt; &#224; la recherche d'une ligne de ce type&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;tail -f /var/log/syslog | grep weewx [snip] Mar 1 06:48:23 raspberrypi weewx[3998] INFO weewx.restx: MQTT: Published record 2021-03-01 06:45:00 CET (1614588300) [snip] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Mosquitto, un broker MQTT</title>
		<link>https://www.momh.fr/mosquitto-un-broker-mqtt</link>
		<guid isPermaLink="true">https://www.momh.fr/mosquitto-un-broker-mqtt</guid>
		<dc:date>2020-12-11T22:21:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>
		<dc:subject>Raspberry Pi</dc:subject>

		<description>
&lt;p&gt;J'ai d&#233;couvert le protocole &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt; (Message Queuing Telemetry Transport) lors de l'interfa&#231;age de ma station m&#233;t&#233;o Netatmo et du logiciel WeeWX sur mon Raspberry Pi&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; il s'agit d'un protocole de messagerie de type publication-abonnement, extr&#234;mement rapide et l&#233;ger, utilis&#233; notamment dans l'internet des objets. &lt;br class='autobr' /&gt; Nous allons ici voir comment installer et configurer un broker, un agent &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt;, en l'occurrence Mosquitto, en nous appuyant tr&#232;s largement sur l'article &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;How to setup your own &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt;&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/raspberry-pi" rel="tag"&gt;Raspberry Pi&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;J'ai d&#233;couvert le protocole &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt; (Message Queuing Telemetry Transport) lors de l'interfa&#231;age de ma station m&#233;t&#233;o Netatmo et du logiciel WeeWX sur mon Raspberry Pi&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; il s'agit d'un protocole de messagerie de type publication-abonnement, extr&#234;mement rapide et l&#233;ger, utilis&#233; notamment dans l'internet des objets.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Nous allons ici voir comment installer et configurer un broker, un agent &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt;, en l'occurrence Mosquitto, en nous appuyant tr&#232;s largement sur l'article &lt;a href=&#034;https://obrienlabs.net/how-to-setup-your-own-mqtt-broker/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;How to setup your own &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt; Broker&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; de Pat O'Brien&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation et premiers tests&lt;/h2&gt;
&lt;p&gt;On commence par l'installer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install mosquitto mosquitto-clients &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nous pouvons d&#232;s lors &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;jouer&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; un peu...&lt;br class='autobr' /&gt;
On peut commencer par v&#233;rifier la version de notre agent ou le temps &#233;coul&#233; depuis son lancement&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_sub -t \$SYS/broker/version mosquitto_sub -t \$SYS/broker/uptime &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis commencez par ouvrir deux sessions dans votre terminal (on ne saurait trop vous conseiller d'utiliser tmux, pr&#233;sent&#233; &lt;a href='https://www.momh.fr/spip.php?page=article&amp;id_article=25'&gt;dans cet article&lt;/a&gt;)&#160;: dans la premi&#232;re, on lance la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mosquitto_sub -t test/#&lt;/code&gt; puis dans la seconde on lance &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;mosquitto_pub -t test/test -m &#034;Test message&#034;&lt;/code&gt;...&lt;/p&gt;
&lt;div class='spip_document_37 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href='https://www.momh.fr/IMG/png/mosquitto_a.png' class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='https://www.momh.fr/local/cache-vignettes/L500xH281/mosquitto_a-7ed6c.png?1788572273' width='500' height='281' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Configuration, acc&#232;s, &lt;span class=&#034;caps&#034;&gt;SSL&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Il convient de pr&#233;ciser d'embl&#233;e que Mosquitto est tr&#232;s regardant sur le formatage de ses fichiers de configuration et qu'il n'accepte pas d'espace en fin de ligne.&lt;/p&gt;
&lt;p&gt;On commence par &#233;diter un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/mosquitto/conf.d/myconfig.conf&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;persistence false # mqtt listener 1883 protocol mqtt # websockets listener 9001 protocol websockets &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On red&#233;marre alors Mosquitto&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo service mosquitto restart &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Gestion des acc&#232;s&lt;/h3&gt;
&lt;p&gt;Mosquitto permet de g&#233;rer topic par topic les droits de publication et d'abonnement.&lt;/p&gt;
&lt;p&gt;On commence par g&#233;n&#233;rer un couple identifiant / mot de passe, ainsi&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo mosquitto_passwd -c /etc/mosquitto/passwd USER &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;puis on &#233;dite un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/mosquitto/acl&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# Autoriser l'abonnement anonyme &#224; $SYS topic read $SYS/# # Autoriser l'abonnement et la publication anonymes &#224; test topic test/# # Autoriser le seul abonnement anonyme &#224; testlecture topic read testlecture/# # Acc&#232;s limit&#233; pour l'&#233;criture sur testlecture # Abonnement et publication sur secret pour USER seulement user USER topic write testlecture topic secret/# &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;on &#233;dite ensuite le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/mosquitto/conf.d/myconfig.conf&lt;/code&gt; pour qu'il ressemble &#224; cela&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;persistence false allow_anonymous true password_file /etc/mosquitto/passwd acl_file /etc/mosquitto/acl # mqtt listener 1883 protocol mqtt # websockets listener 9001 protocol websockets &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On red&#233;marre le service avant de v&#233;rifier avec la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;netstat&lt;/code&gt; que les ports d&#233;clar&#233;s sont bien ouverts&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$ sudo service mosquitto restart $ sudo netstat -tulpn | grep 1883 tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN 142015/mosquitto tcp6 0 0 :::1883 :::* LISTEN 142015/mosquitto $ sudo netstat -tulpn | grep 9001 tcp6 0 0 :::9001 :::* LISTEN 142015/mosquitto &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour le canal &lt;i&gt;test&lt;/i&gt;, accessible sans authentification ni pour l'abonnement ni pour la publication, on v&#233;rifie avec cette commande dans notre premi&#232;re session&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_sub -h localhost -p 1883 -t test/# &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et dans la seconde nous lan&#231;ons&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_pub -h localhost -p 1883 -t test/1 -m &#034;Hello topic test/1&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le canal &lt;i&gt;testlecture&lt;/i&gt; ne devrait &#234;tre accessible anonymement qu'en lecture&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_sub -h localhost -p 1883 -t testlecture/# &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La premi&#232;re des deux commandes suivantes ne devrait rien renvoyer dans notre premi&#232;re session&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; il convient en effet de s'authentifier pour publier dans ce canal&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_pub -t testlecture/test -m &#034;test&#034; mosquitto_pub -u USER -P PASSWORD -t testlecture/test -m &#034;test&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, le canal secret n&#233;cessite de s'authentifier aussi bien pour l'abonnement que pour la publication&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_sub -u USER -P PASSWORD -t secret/# &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_pub -u USER -P PASSWORD -t secret/test -m &#034;test&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Certificat &lt;span class=&#034;caps&#034;&gt;SSL&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Il est bien &#233;videmment possible de rendre cet agent &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt; accessible sur Internet et de le configurer pour qu'il utilise une connexion s&#233;curis&#233;e gr&#226;ce &#224; un certificat comme ceux propos&#233;s par Let's Encrypt. Nous allons consid&#233;rer ici que vous avez d&#233;j&#224; configur&#233; votre nom de domaine et g&#233;n&#233;r&#233; le certificat, &lt;a href='https://www.momh.fr/auto-hebergement-dynhost-ovh-et-certificat-let-s-encrypt-sous-raspbian' class=&#034;spip_in&#034;&gt;comme &#233;voqu&#233; ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, dans mon cas, vous devriez pouvoir vous abonner au canal &lt;i&gt;weather&lt;/i&gt; produit par WeeWX et son plugin weewx-mqtt avec la commande suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_sub -h meteo.momh.fr -p 8883 --capath /etc/ssl/certs/ -t weather/# &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il convient, apr&#232;s avoir g&#233;n&#233;r&#233; son certificat, d'&#233;diter le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/mosquitto/conf.d/myconfig.conf&lt;/code&gt; de la sorte&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;# Insecure mqtt to localhost only, and secure mqtt listener 1883 localhost listener 8883 certfile /etc/letsencrypt/live/DOMAINE/cert.pem cafile /etc/letsencrypt/live/DOMAINE/chain.pem keyfile /etc/letsencrypt/live/DOMAINE/privkey.pem protocol mqtt # websockets listener 9001 certfile /etc/letsencrypt/live/DOMAINE/cert.pem cafile /etc/letsencrypt/live/DOMAINE/chain.pem keyfile /etc/letsencrypt/live/DOMAINE/privkey.pem protocol websockets &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Apr&#232;s avoir red&#233;marr&#233; le service&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo service mosquitto restart &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;on peut tester ainsi, avec pour chacune de nos deux sessions, les commandes&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_sub -h DOMAINE -p 8883 --capath /etc/ssl/certs/ -u USER -P PASSWORD -t secret/# &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mosquitto_pub -h DOMAINE -p 8883 -u USER -P PASSWORD --capath /etc/ssl/certs/ -t secret/test -m &#034;Test message dans le canal secret&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Nous pouvons d&#233;sormais utiliser notre agent &lt;span class=&#034;caps&#034;&gt;MQTT&lt;/span&gt; &lt;a href='https://www.momh.fr/weewx-mqtt-et-skin-belchertown' class=&#034;spip_in&#034;&gt;avec WeeWX&lt;/a&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;!&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Auto-h&#233;bergement, DynHost OVH et certificat Let's Encrypt sous Raspbian</title>
		<link>https://www.momh.fr/auto-hebergement-dynhost-ovh-et-certificat-let-s-encrypt-sous-raspbian</link>
		<guid isPermaLink="true">https://www.momh.fr/auto-hebergement-dynhost-ovh-et-certificat-let-s-encrypt-sous-raspbian</guid>
		<dc:date>2020-12-06T09:28:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>
		<dc:subject>WeeWX</dc:subject>
		<dc:subject>auto-h&#233;bergement</dc:subject>
		<dc:subject>Raspberry Pi</dc:subject>

		<description>
&lt;p&gt;Ayant &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;associ&#233;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; ma station m&#233;t&#233;o Netatmo &#224; mon Raspberry Pi gr&#226;ce &#224; WeeWX (lire ce post), je souhaite d&#233;sormais rendre accessible sur Internet le site web ainsi g&#233;n&#233;r&#233;. Je consid&#232;re ainsi que vous avez d&#233;j&#224; un serveur Apache fonctionnel et configur&#233; (m&#234;me si nous aborderons la cr&#233;ation d'un VirtualHost par la suite). &lt;br class='autobr' /&gt; DynHost et mise &#224; jour de l'&lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt; &lt;br class='autobr' /&gt;
&#201;tant chez &lt;span class=&#034;caps&#034;&gt;OVH&lt;/span&gt;, je profite de leur service DynHOST qui &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;permet de faire pointer un sous-domaine vers une adresse &lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt; dynamique qui sera&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/weewx" rel="tag"&gt;WeeWX&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/auto-hebergement" rel="tag"&gt;auto-h&#233;bergement&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/raspberry-pi" rel="tag"&gt;Raspberry Pi&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Ayant &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;associ&#233;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187; ma station m&#233;t&#233;o Netatmo &#224; mon Raspberry Pi gr&#226;ce &#224; WeeWX (&lt;a href='https://www.momh.fr/station-meteo-netatmo-weewx-bis' class=&#034;spip_in&#034;&gt;lire ce post&lt;/a&gt;), je souhaite d&#233;sormais rendre accessible sur Internet le site web ainsi g&#233;n&#233;r&#233;. Je consid&#232;re ainsi que vous avez d&#233;j&#224; un serveur Apache fonctionnel et configur&#233; (m&#234;me si nous aborderons la cr&#233;ation d'un VirtualHost par la suite).&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;DynHost et mise &#224; jour de l'&lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&#201;tant chez &lt;span class=&#034;caps&#034;&gt;OVH&lt;/span&gt;, je profite de leur service DynHOST qui &#171;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&lt;i&gt;permet de faire pointer un sous-domaine vers une adresse &lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt; dynamique qui sera mise &#224; jour dans votre zone &lt;span class=&#034;caps&#034;&gt;DNS&lt;/span&gt; &#224; chaque changement de celle-ci.&lt;/i&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;&#187;.&lt;/p&gt;
&lt;p&gt;On cr&#233;e notre DynHost puis on en g&#232;re les acc&#232;s, en cr&#233;ant un nouvel identifiant. Puis, sur notre Raspberry Pi, on installe &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;ddclient&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install ddclient &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lors de l'installation, des &#233;crans successifs vont nous permettre de le configurer&#160;:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;i&gt;Fournisseur de service de &lt;span class=&#034;caps&#034;&gt;DNS&lt;/span&gt; dynamique&#160;:&lt;/i&gt; Autre&lt;/li&gt;&lt;li&gt; &lt;i&gt;Protocole de mise &#224; jour du &lt;span class=&#034;caps&#034;&gt;DNS&lt;/span&gt; dynamique&#160;:&lt;/i&gt; dyndns2&lt;/li&gt;&lt;li&gt; &lt;i&gt;Serveur de &lt;span class=&#034;caps&#034;&gt;DNS&lt;/span&gt; dynamique&#160;:&lt;/i&gt; &lt;a href=&#034;http://www.ovh.com&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;www.ovh.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;i&gt;Mandataire &lt;span class=&#034;caps&#034;&gt;HTTP&lt;/span&gt;&#160;:&lt;/i&gt; n&#233;ant&lt;/li&gt;&lt;li&gt; &lt;i&gt;Identifiant&#160;:&lt;/i&gt; l'identifiant saisi pr&#233;c&#233;demment (comprenant le nom de domaine en pr&#233;fixe)&lt;/li&gt;&lt;li&gt; &lt;i&gt;Mot de passe&#160;:&lt;/i&gt; le mot de passe correspondant&lt;/li&gt;&lt;li&gt; &lt;i&gt;M&#233;thode de d&#233;couverte d'adresse &lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt;&#160;:&lt;/i&gt; Service de d&#233;couverte d'&lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt; bas&#233;e sur le web&lt;/li&gt;&lt;li&gt; &lt;i&gt;H&#244;tes &#224; mettre &#224; jour&#160;:&lt;/i&gt; le DynHost cr&#233;&#233; pr&#233;c&#233;demment&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La configuration peut se faire sinon &#224; la main, en &#233;ditant le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/ddclient.conf&lt;/code&gt; qui doit ressembler &#224; cela&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;protocol=dyndns2 use=web, web=checkip.dyndns.com server=www.ovh.com login=DOMAINE-USER password='PASSWORD' DYNHOST &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il vous faut ensuite &#233;diter le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/default/ddclient&lt;/code&gt; et veiller &#224; bien avoir&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;run_daemon=&#034;true&#034; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et enfin, on red&#233;marre ddclient&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo service ddclient restart &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Redirection des ports&lt;/h2&gt;
&lt;p&gt;Ensuite, il faut se rendre dans l'interface de gestion de votre Box Internet et configurer, dans la section &lt;span class=&#034;caps&#034;&gt;NAT&lt;/span&gt;, la redirection des port 80 et 443 vers ceux de votre Raspberry Pi (pour en conna&#238;tre l'&lt;span class=&#034;caps&#034;&gt;IP&lt;/span&gt; sur votre r&#233;seau local, utilisez la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;hostname -I&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;D&#233;sormais, en saisissant l'&lt;span class=&#034;caps&#034;&gt;URL&lt;/span&gt; de votre DynHost, vous devriez acc&#233;der &#224; la m&#234;me page que lorsque vous acc&#233;dez &#224; l'adresse localhost.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Mise en place du &lt;span class=&#034;caps&#034;&gt;HTTPS&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Pour ce faire, nous allons g&#233;n&#233;rer un certificat Let's Encrypt pour notre DynHost.&lt;/p&gt;
&lt;p&gt;On commence par copier, dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/apache2/sites-available/&lt;/code&gt;, le fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;000-default.conf&lt;/code&gt; vers &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;DYNHOST.conf&lt;/code&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; par exemple&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/meteo.momh.fr.conf &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;puis par le configurer pour pointer vers notre r&#233;pertoire &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/var/www/html/weewx&lt;/code&gt; ou autre r&#233;pertoire en fonction du ou des skin(s) que vous utilisez. Par exemple, minimalement&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apacheconf&#034; class='spip_code spip_code_block language-apacheconf' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;VirtualHost *:80&gt; ServerName meteo.momh.fr ServerAdmin webmaster@localhost DocumentRoot /var/www/html/weewx ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined &lt;/VirtualHost&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour g&#233;n&#233;rer le certificat, nous allons utiliser &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;certbot&lt;/code&gt;, qu'il convient d'installer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo apt install certbot python3-certbot-apache &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;puis d'activer le module ssl d'Apache&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo a2enmode ssl sudo systemctl restart apache2 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On peut alors g&#233;n&#233;rer notre certificat avec la commande suivante&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo certbot --apache -d DynHOST &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Il vous est propos&#233; de rediriger l'&#233;ventuel traffic &lt;span class=&#034;caps&#034;&gt;HTTP&lt;/span&gt; vers &lt;span class=&#034;caps&#034;&gt;HTTPS&lt;/span&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Un certificat est alors g&#233;n&#233;r&#233; et un nouvel h&#244;te virtuel est configur&#233; dans Apache, &#224; l'emplacement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/apache2/sites-available/DYNHOST-le-ssl.conf&lt;/code&gt;. Si vous avez choisi l'option 2, le VirtualHost pr&#233;sent&#233; ci-dessus se voit modifi&#233; avec les lignes suivantes&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;apacheconf&#034; class='spip_code spip_code_block language-apacheconf' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;RewriteEngine on RewriteCond %{SERVER_NAME} =DYNHOST RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour voir que tout fonctionne, on peut utiliser l'outil de test propos&#233; par &lt;a href=&#034;https://www.ssllabs.com/ssltest/analyze.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ssllabs.com&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Station m&#233;t&#233;o Netatmo &amp; WeeWX [bis]</title>
		<link>https://www.momh.fr/station-meteo-netatmo-weewx-bis</link>
		<guid isPermaLink="true">https://www.momh.fr/station-meteo-netatmo-weewx-bis</guid>
		<dc:date>2020-11-05T09:13:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Brice Boucard</dc:creator>


		<dc:subject>Linux</dc:subject>
		<dc:subject>Raspberry Pi</dc:subject>
		<dc:subject>WeeWX</dc:subject>

		<description>
&lt;p&gt;Suite &#224; mon premier post sur le sujet (auquel il convient de se reporter pour la configuration et l'utilisation d'une base de donn&#233;e MySQL), je me suis attel&#233; plus longuement &#224; la compatibilit&#233; du plugin weewx-netatmo de Matthew Wall avec les versions 4 de WeeWX sous Python 3. &lt;br class='autobr' /&gt; Installation &lt;br class='autobr' /&gt;
De ce fait, on n'a plus besoin d'installer une ancienne version de WeeWX et l'on peut se reporter sur la version disponible dans les d&#233;p&#244;ts&#160;: bash wget -qO - https://weewx.com/keys.html | sudo apt-key&#160;(&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.momh.fr/blog" rel="directory"&gt;Blog&lt;/a&gt;

/ 
&lt;a href="https://www.momh.fr/linux" rel="tag"&gt;Linux&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/raspberry-pi" rel="tag"&gt;Raspberry Pi&lt;/a&gt;, 
&lt;a href="https://www.momh.fr/weewx" rel="tag"&gt;WeeWX&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Suite &#224; &lt;a href='https://www.momh.fr/station-meteo-netatmo-weewx' class=&#034;spip_in&#034;&gt;mon premier post sur le sujet&lt;/a&gt; (auquel il convient de se reporter pour la configuration et l'utilisation d'une base de donn&#233;e MySQL), je me suis attel&#233; plus longuement &#224; la compatibilit&#233; du &lt;a href=&#034;https://github.com/matthewwall/weewx-netatmo&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plugin weewx-netatmo de Matthew Wall&lt;/a&gt; avec les versions 4 de &lt;a href=&#034;https://www.weewx.com&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;WeeWX&lt;/a&gt; sous Python 3.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2 class=&#034;spip&#034;&gt;Installation&lt;/h2&gt;
&lt;p&gt;De ce fait, on n'a plus besoin d'installer une ancienne version de WeeWX et l'on peut se reporter sur la version disponible dans les d&#233;p&#244;ts&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget -qO - https://weewx.com/keys.html | sudo apt-key add - wget -qO - https://weewx.com/apt/weewx-python3.list | sudo tee /etc/apt/sources.list.d/weewx.list sudo apt update sudo apt install weewx &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;D&#233;sormais, la configuration et autres skins ne se trouvent plus dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/home/weewx&lt;/code&gt; mais dans &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/weewx&lt;/code&gt;. L'installation du plugin weewx-netatmo peut se faire depuis mon fork du plugin&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;wget -O weewx-netatmo.zip https://github.com/bricebou/weewx-netatmo/archive/master.zip sudo wee_extension --install weewx-netatmo.zip sudo wee_config --reconfigure &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On ouvre ensuite le fichier de configuration &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/etc/weewx/weewx.conf&lt;/code&gt; pour v&#233;rifier que nos identifiants Netatmo soient bien pris en compte. Ensuite, on red&#233;marre WeeWX&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo service weewx restart &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Modifications apport&#233;es&lt;/h2&gt;
&lt;p&gt;Pour ce faire, on utilise l'outil &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;2to3&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;sudo pip3 install 2to3 &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;puis on lance la commande&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;bash&#034; class='spip_code spip_code_block language-bash' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;2to3 -w netatmo.py &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une erreur subsistait mais le probl&#232;me avait d&#233;j&#224; &#233;t&#233; r&#233;solu par &lt;a href=&#034;https://github.com/matthewwall/weewx-netatmo/issues/15#issuecomment-628994957&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;kwalker05&lt;/a&gt;&lt;small class=&#034;fine d-inline&#034;&gt;&#160;&lt;/small&gt;; il suffit, &#224; la ligne 521, de remplacer&#160;:&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;python&#034; class='spip_code spip_code_block language-python' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;params = urlencode(params) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;par&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;python&#034; class='spip_code spip_code_block language-python' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;params = urlencode(params).encode(&#034;utf-8&#034;) &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
