<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Nicolas Birckel</title>
	<subtitle></subtitle>
	<link href="https://www.nicolas-birckel.fr/feed.xml" rel="self"/>
	<link href="https://www.nicolas-birckel.fr/"/>
	
	<updated>2024-09-02T07:17:53Z</updated>
	
	<id>https://www.nicolas-birckel.fr</id>
	<author>
  <name>Nicolas Birckel</name>
  <email>hello@nicolas-birckel.fr</email>
	</author>
	
  
  <entry>
    <title>L&#39;université c&#39;est fini !</title>
    <link href="https://www.nicolas-birckel.fr/posts/luniversité-cest-fini/"/>
    <pubDate>2024-09-02T07:17:53Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/luniversité-cest-fini/</id>
    <content type="html"><![CDATA[
      <p>Après 5 cdd, mon contrat à l'Université de Lorraine n'as pas été renouvellé pour cette année universitaire 2024-25.</p>
<p>Ces annéees au sein de la direction du patrimoine immobilier furent très enrichissantes tant professionnellement qu'humainement et c'est avec un pincement au coeur que je laisse mes collègues et les projets en cours.</p>
<p>Mais cela a également été l'occasion de prendre conscience de nouvelles envies et aspirations professionnelles qui sont déjà concrétisées par une embauche signée et une prise de poste au 2 janvier au Luxembourg.</p>
<p>En attendant celle-ci, je suis disponible pour des missions courtes de consulting.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Créer un dashboard en python avec Panel</title>
    <link href="https://www.nicolas-birckel.fr/posts/créer-un-dashboard-en-python-avec-panel/"/>
    <pubDate>2024-03-15T10:51:57Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/créer-un-dashboard-en-python-avec-panel/</id>
    <content type="html"><![CDATA[
      <h2>Objectif :</h2>
<p>Centraliser et présenter sur une même page les divers indicateurs et informations de pilotage des bâtiments utilisés dans les études de réaménagement ou d'optimisation :</p>
<ul>
<li>la surface de plancher (sdp),</li>
<li>la surface utile brute (sub),</li>
<li>la surface utile net (sun),</li>
<li>le ratio sun/sub qui permet de définir les bâtiments dit 'de bureau',</li>
<li>le ratio sun / postes de travail (pdt) qui permet de déterminer l'optimisation des surfaces de bureau (le ratio cible de l'État est de 12m2 par poste de travail),</li>
<li>le nombre d'amphithéâtres et de salles banalisées et leurs taux d'occupation N-1, qui permet d'apprécier l'utilisation effective des bâtiments d'enseignement.</li>
<li>la répartition des surfaces au sein du bâtiment selon 3 critères : les typologies de pièces, les usages, et les occupants.</li>
</ul>
<h2>Les sources de données</h2>
<p>N'ayant pas d'accès au bases de données / API en direct pour les interroger depuis mon dashboard, j'ai réalisé 3 extractions depuis divers outils métier pour pouvoir exploiter la donnée avec <a href="https://pandas.pydata.org/">pandas</a> :</p>
<p><strong>L'intégralité des pièces du patrimoine :</strong></p>
<table>
<thead>
<tr>
<th>Column</th>
<th>Non-Null Count</th>
<th>Dtype</th>
</tr>
</thead>
<tbody>
<tr>
<td>NOM_SITE</td>
<td>43487</td>
<td>object</td>
</tr>
<tr>
<td>Bâtiment</td>
<td>43487</td>
<td>object</td>
</tr>
<tr>
<td>NOM_ETAGE</td>
<td>43487</td>
<td>object</td>
</tr>
<tr>
<td>LIBELLE_PIECE</td>
<td>38090</td>
<td>object</td>
</tr>
<tr>
<td>TYPE_PIECE</td>
<td>43487</td>
<td>object</td>
</tr>
<tr>
<td>NUMERO_INTERNE_PIECE</td>
<td>43487</td>
<td>int32</td>
</tr>
<tr>
<td>USAGE_PIECE</td>
<td>39921</td>
<td>object</td>
</tr>
<tr>
<td>AFFECTATAIRE</td>
<td>42008</td>
<td>object</td>
</tr>
<tr>
<td>SDP</td>
<td>43487</td>
<td>float64</td>
</tr>
<tr>
<td>SUB</td>
<td>43487</td>
<td>float64</td>
</tr>
<tr>
<td>SUN</td>
<td>43487</td>
<td>float64</td>
</tr>
</tbody>
</table>
<p><strong>l'intégralité des réservations de salles pour l'année universitaire 2022-23 :</strong></p>
<table>
<thead>
<tr>
<th>Column</th>
<th>Non-Null Count</th>
<th>Dtype</th>
</tr>
</thead>
<tbody>
<tr>
<td>Type Salle</td>
<td>315009</td>
<td>object</td>
</tr>
<tr>
<td>Année</td>
<td>315009</td>
<td>int64</td>
</tr>
<tr>
<td>Libellé site</td>
<td>315009</td>
<td>object</td>
</tr>
<tr>
<td>Durée de l'activité</td>
<td>315009</td>
<td>float64</td>
</tr>
<tr>
<td>Libellé de salle</td>
<td>315009</td>
<td>object</td>
</tr>
<tr>
<td>Libellé bâtiment</td>
<td>315009</td>
<td>object</td>
</tr>
</tbody>
</table>
<p><strong>Les effectifs et postes de travail déclarés par bâtiment</strong> :</p>
<table>
<thead>
<tr>
<th>Column</th>
<th>Non-Null Count</th>
<th>Dtype</th>
</tr>
</thead>
<tbody>
<tr>
<td>numéro interne</td>
<td>266</td>
<td>int64</td>
</tr>
<tr>
<td>bâtiments</td>
<td>266</td>
<td>object</td>
</tr>
<tr>
<td>Effectif déclaré</td>
<td>266</td>
<td>int64</td>
</tr>
<tr>
<td>nb de poste de travail</td>
<td>214</td>
<td>float64</td>
</tr>
</tbody>
</table>
<p>D'après la methode .nunique(), il y a dans notre patrimoine : <strong>259</strong> bâtiments, répartis sur <strong>53</strong> sites pour <strong>1926</strong> salles d'enseignement, dont il faut traiter les données pour les afficher sur notre dashboard.</p>
<h2>Les libs python utilisés :</h2>
<ul>
<li>Pandas pour la manipulation de données,</li>
<li><a href="https://plotly.com/python/plotly-express/">plotly-express</a> pour les graphiques,</li>
<li><a href="https://panel.holoviz.org/">Panel</a> pour le dashboard interactif</li>
</ul>
<h2>Le code :</h2>
<pre class="language-python"><code class="language-python"><span class="token keyword">import</span> pandas <span class="token keyword">as</span> pd<br><span class="token keyword">import</span> panel <span class="token keyword">as</span> pn<br><span class="token keyword">import</span> plotly<span class="token punctuation">.</span>express <span class="token keyword">as</span> px<br>df <span class="token operator">=</span> pd<span class="token punctuation">.</span>read_excel<span class="token punctuation">(</span><span class="token string">"Ensemble des pièces.xls"</span><span class="token punctuation">)</span><br>adf <span class="token operator">=</span>pd<span class="token punctuation">.</span>read_csv<span class="token punctuation">(</span><span class="token string">'2022.csv'</span><span class="token punctuation">,</span> delimiter<span class="token operator">=</span><span class="token string">';'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>groupby<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'Salle SIPI'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'Durée de l\'activité'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token punctuation">)</span><br>pdt <span class="token operator">=</span>  pd<span class="token punctuation">.</span>read_excel<span class="token punctuation">(</span><span class="token string">"pdt.xls"</span><span class="token punctuation">)</span><br><br><span class="token comment">#un peu de nettoyage/ formatage</span><br>df <span class="token operator">=</span> df<span class="token punctuation">.</span>drop_duplicates<span class="token punctuation">(</span>subset<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'NUMERO_INTERNE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token comment"># on élimine les doublons de multi usage pour garder que le principal</span><br>df<span class="token punctuation">.</span>rename<span class="token punctuation">(</span>columns<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'SDP - Surface de Plancher'</span> <span class="token punctuation">:</span> <span class="token string">'SDP'</span><span class="token punctuation">,</span> <span class="token string">'SUB - Surface Utile Brute'</span> <span class="token punctuation">:</span> <span class="token string">'SUB'</span><span class="token punctuation">,</span> <span class="token string">'SUN - Surface Utile Nette'</span> <span class="token punctuation">:</span> <span class="token string">'SUN'</span><span class="token punctuation">}</span><span class="token punctuation">,</span> inplace<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span><br>df<span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span> <span class="token operator">=</span>df<span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">","</span> <span class="token punctuation">,</span> <span class="token string">"."</span><span class="token punctuation">,</span> regex<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token builtin">float</span><span class="token punctuation">)</span><br>df<span class="token punctuation">[</span><span class="token string">'SUB'</span><span class="token punctuation">]</span> <span class="token operator">=</span>df<span class="token punctuation">[</span><span class="token string">'SUB'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">","</span> <span class="token punctuation">,</span> <span class="token string">"."</span><span class="token punctuation">,</span> regex<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token builtin">float</span><span class="token punctuation">)</span><br>df<span class="token punctuation">[</span><span class="token string">'SUN'</span><span class="token punctuation">]</span> <span class="token operator">=</span>df<span class="token punctuation">[</span><span class="token string">'SUN'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">","</span> <span class="token punctuation">,</span> <span class="token string">"."</span><span class="token punctuation">,</span> regex<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token builtin">float</span><span class="token punctuation">)</span><br>df<span class="token punctuation">[</span><span class="token string">'NUMERO_INTERNE_PIECE'</span><span class="token punctuation">]</span><span class="token operator">=</span>df<span class="token punctuation">[</span><span class="token string">'NUMERO_INTERNE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">)</span><br>adf<span class="token punctuation">[</span><span class="token string">'Salle SIPI'</span><span class="token punctuation">]</span> <span class="token operator">=</span>adf<span class="token punctuation">[</span><span class="token string">'Salle SIPI'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">"ABY_"</span> <span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">,</span> regex<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">)</span><br>pdt<span class="token punctuation">.</span>fillna<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> inplace<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span><br>df <span class="token operator">=</span> df<span class="token punctuation">.</span>set_index<span class="token punctuation">(</span><span class="token string">'NUMERO_INTERNE_PIECE'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>adf<span class="token punctuation">.</span>set_index<span class="token punctuation">(</span><span class="token string">'Salle SIPI'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token punctuation">)</span><br>list_site <span class="token operator">=</span> df<span class="token punctuation">[</span><span class="token string">'NOM_SITE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sort_values<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>unique<span class="token punctuation">(</span><span class="token punctuation">)</span><br><br><span class="token keyword">class</span> <span class="token class-name">building</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><br><br>    <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span>bat<span class="token punctuation">)</span><span class="token punctuation">:</span><br>        <span class="token comment">#on recupère les données lié au bâtiment</span><br>        self<span class="token punctuation">.</span>name <span class="token operator">=</span> bat<br>        self<span class="token punctuation">.</span>data <span class="token operator">=</span> df<span class="token punctuation">[</span>df<span class="token punctuation">[</span><span class="token string">'Bâtiment'</span><span class="token punctuation">]</span> <span class="token operator">==</span> bat<span class="token punctuation">]</span>    <br>        self<span class="token punctuation">.</span>sdp <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><br>        self<span class="token punctuation">.</span>sub <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'SUB'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><br>        self<span class="token punctuation">.</span>sun <span class="token operator">=</span> <span class="token builtin">round</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'SUN'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><br>        self<span class="token punctuation">.</span>sbCount <span class="token operator">=</span>self<span class="token punctuation">.</span>data<span class="token punctuation">[</span>self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"116-Salle banalisée"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'NUMERO_INTERNE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>nunique<span class="token punctuation">(</span><span class="token punctuation">)</span><br>        self<span class="token punctuation">.</span>amphiCount <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">[</span>self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"117-Amphithéâtre"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'NUMERO_INTERNE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>nunique<span class="token punctuation">(</span><span class="token punctuation">)</span><br>        self<span class="token punctuation">.</span>pdtCount <span class="token operator">=</span> pdt<span class="token punctuation">[</span>pdt<span class="token punctuation">[</span><span class="token string">'Bâtiment'</span><span class="token punctuation">]</span> <span class="token operator">==</span> self<span class="token punctuation">.</span>name<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'Nombre de postes de travail'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>values<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><br><br>    <span class="token keyword">def</span> <span class="token function">chart</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> <span class="token builtin">type</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># une méthode pour créer les graphiques de répartition de surface</span><br>        color_scale <span class="token operator">=</span> px<span class="token punctuation">.</span>colors<span class="token punctuation">.</span>qualitative<span class="token punctuation">.</span>Set2<br>        <span class="token comment">#on définit les valeurs manquantes dans les types de pièces, affectataire et usage comme "Non déclaré"</span><br>        self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span><span class="token punctuation">]</span> <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>fillna<span class="token punctuation">(</span> value<span class="token operator">=</span><span class="token string">"Non déclaré"</span><span class="token punctuation">)</span><br>        self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'AFFECTATAIRE'</span><span class="token punctuation">]</span> <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'AFFECTATAIRE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>fillna<span class="token punctuation">(</span> value<span class="token operator">=</span><span class="token string">"Non déclaré"</span><span class="token punctuation">)</span><br>        self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'USAGE_PIECE'</span><span class="token punctuation">]</span><span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token string">'USAGE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>fillna<span class="token punctuation">(</span> value<span class="token operator">=</span><span class="token string">"Non déclaré"</span><span class="token punctuation">)</span><br>        <span class="token keyword">if</span> <span class="token builtin">type</span> <span class="token operator">==</span><span class="token string">'typologie'</span> <span class="token punctuation">:</span><br>            sub_df <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">.</span>groupby<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token punctuation">)</span><br>            name <span class="token operator">=</span><span class="token string">'TYPE_PIECE'</span><br>        <span class="token keyword">if</span> <span class="token builtin">type</span> <span class="token operator">==</span><span class="token string">'affectataire'</span> <span class="token punctuation">:</span><br>             sub_df <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">.</span>groupby<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'AFFECTATAIRE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token punctuation">)</span><br>             name <span class="token operator">=</span><span class="token string">'AFFECTATAIRE'</span><br>        <span class="token keyword">if</span> <span class="token builtin">type</span> <span class="token operator">==</span><span class="token string">'usage'</span> <span class="token punctuation">:</span><br>             sub_df <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">.</span>groupby<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'USAGE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token punctuation">)</span><br>             name <span class="token operator">=</span><span class="token string">'USAGE_PIECE'</span><br>        pie_fig <span class="token operator">=</span> px<span class="token punctuation">.</span>pie<span class="token punctuation">(</span>sub_df<span class="token punctuation">,</span> values<span class="token operator">=</span><span class="token string">'SDP'</span><span class="token punctuation">,</span> names<span class="token operator">=</span>name<span class="token punctuation">,</span> color_discrete_sequence <span class="token operator">=</span> color_scale<span class="token punctuation">)</span><br>        pie_fig<span class="token punctuation">.</span>update_traces<span class="token punctuation">(</span>textposition<span class="token operator">=</span><span class="token string">'inside'</span><span class="token punctuation">,</span> direction <span class="token operator">=</span><span class="token string">'clockwise'</span><span class="token punctuation">,</span> hole<span class="token operator">=</span><span class="token number">0.3</span><span class="token punctuation">,</span> textinfo<span class="token operator">=</span><span class="token string">"label+percent"</span><span class="token punctuation">)</span><br>        pie_fig<span class="token punctuation">.</span>update_layout<span class="token punctuation">(</span>uniformtext_minsize<span class="token operator">=</span><span class="token number">10</span><span class="token punctuation">,</span><br>                            uniformtext_mode<span class="token operator">=</span><span class="token string">'hide'</span><span class="token punctuation">,</span><br>                            title<span class="token operator">=</span><span class="token string">"Par "</span><span class="token operator">+</span><span class="token builtin">type</span><span class="token punctuation">,</span><br>                        <span class="token punctuation">)</span><br>        <span class="token keyword">return</span> pie_fig<br><br>    <span class="token keyword">def</span> <span class="token function">dataFrame</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span><span class="token builtin">type</span><span class="token punctuation">)</span> <span class="token punctuation">:</span>  <span class="token comment"># une méthode pour retourner un dataframe sortable des répartitions de surface</span><br>        <span class="token keyword">if</span> <span class="token builtin">type</span> <span class="token operator">==</span><span class="token string">'typologie'</span> <span class="token punctuation">:</span><br>            sub_df <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">.</span>groupby<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token string">'TYPE_PIECE'</span><span class="token punctuation">)</span><br>        <span class="token keyword">if</span> <span class="token builtin">type</span> <span class="token operator">==</span><span class="token string">'affectataire'</span> <span class="token punctuation">:</span><br>             sub_df <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">.</span>groupby<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'AFFECTATAIRE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token string">'AFFECTATAIRE'</span><span class="token punctuation">)</span><br>        <span class="token keyword">if</span> <span class="token builtin">type</span> <span class="token operator">==</span><span class="token string">'usage'</span> <span class="token punctuation">:</span><br>             sub_df <span class="token operator">=</span> self<span class="token punctuation">.</span>data<span class="token punctuation">.</span>groupby<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'USAGE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token string">'USAGE_PIECE'</span><span class="token punctuation">)</span><br>        <span class="token keyword">return</span> pn<span class="token punctuation">.</span>widgets<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span>sub_df<span class="token punctuation">,</span> sortable<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span>row_height<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span> widths<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'index'</span><span class="token punctuation">:</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token string">'TYPE_PIECE'</span><span class="token punctuation">:</span><span class="token number">250</span><span class="token punctuation">,</span> <span class="token string">'SDP'</span><span class="token punctuation">:</span> <span class="token number">50</span><span class="token punctuation">}</span><span class="token punctuation">)</span>          <br>    <span class="token keyword">def</span> <span class="token function">tauxOccup</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token comment"># une méthode pour retourner un dict des taux d'occupation des amphithéâtre et salles banalisées</span><br>            t <span class="token operator">=</span> df<span class="token punctuation">[</span>df<span class="token punctuation">[</span><span class="token string">'Bâtiment'</span><span class="token punctuation">]</span> <span class="token operator">==</span> self<span class="token punctuation">.</span>name<span class="token punctuation">]</span><br>            tx <span class="token operator">=</span> <span class="token punctuation">{</span><br>            <span class="token string">'amphi'</span> <span class="token punctuation">:</span> <span class="token builtin">round</span><span class="token punctuation">(</span><br>                <span class="token number">100</span><span class="token operator">*</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span>t<span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"117-Amphithéâtre"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'Durée de l\'activité'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> t<span class="token punctuation">[</span>t<span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"117-Amphithéâtre"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'NUMERO_INTERNE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>nunique<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">1120</span><span class="token punctuation">,</span><br>                <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>            <span class="token string">'sb'</span> <span class="token punctuation">:</span>  <span class="token builtin">round</span><span class="token punctuation">(</span><br>                <span class="token number">100</span><span class="token operator">*</span><span class="token punctuation">(</span>t<span class="token punctuation">[</span>t<span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"116-Salle banalisée"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'Durée de l\'activité'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">/</span> t<span class="token punctuation">[</span>t<span class="token punctuation">[</span><span class="token string">'TYPE_PIECE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"116-Salle banalisée"</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'NUMERO_INTERNE_PIECE'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>nunique<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">1120</span><span class="token punctuation">,</span><br>                <span class="token number">2</span><span class="token punctuation">)</span><br>            <span class="token punctuation">}</span><br>            <span class="token keyword">return</span> tx      <br><span class="token keyword">def</span> <span class="token function">list_bat</span><span class="token punctuation">(</span>site<span class="token punctuation">)</span><span class="token punctuation">:</span><br>    <span class="token keyword">return</span> <span class="token builtin">list</span><span class="token punctuation">(</span>df<span class="token punctuation">[</span>df<span class="token punctuation">[</span><span class="token string">'NOM_SITE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> site<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'Bâtiment'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>sort_values<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>unique<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br><span class="token keyword">def</span> <span class="token function">siteName</span><span class="token punctuation">(</span>site<span class="token punctuation">)</span><span class="token punctuation">:</span><br>    <span class="token keyword">return</span> pn<span class="token punctuation">.</span>pane<span class="token punctuation">.</span>Markdown<span class="token punctuation">(</span><span class="token string">' # '</span><span class="token operator">+</span>site<span class="token punctuation">)</span><br><span class="token keyword">def</span> <span class="token function">siteNbBat</span><span class="token punctuation">(</span>site<span class="token punctuation">)</span><span class="token punctuation">:</span><br>    <span class="token keyword">return</span> df<span class="token punctuation">[</span>df<span class="token punctuation">[</span><span class="token string">'NOM_SITE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> site<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'Bâtiment'</span><span class="token punctuation">]</span><span class="token punctuation">.</span>nunique<span class="token punctuation">(</span><span class="token punctuation">)</span><br><span class="token keyword">def</span> <span class="token function">siteSDP</span><span class="token punctuation">(</span>site<span class="token punctuation">)</span><span class="token punctuation">:</span><br>    <span class="token keyword">return</span> <span class="token builtin">round</span><span class="token punctuation">(</span>df<span class="token punctuation">[</span>df<span class="token punctuation">[</span><span class="token string">'NOM_SITE'</span> <span class="token punctuation">]</span> <span class="token operator">==</span> site<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token string">'SDP'</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token builtin">sum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><br><span class="token keyword">def</span> <span class="token function">tab</span><span class="token punctuation">(</span>bat<span class="token punctuation">)</span><span class="token punctuation">:</span><br>    b <span class="token operator">=</span> building<span class="token punctuation">(</span>bat<span class="token punctuation">)</span><br>    type_chart <span class="token operator">=</span> pn<span class="token punctuation">.</span>widgets<span class="token punctuation">.</span>Select<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Selectionnez une valeur'</span><span class="token punctuation">,</span> options<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'typologie'</span><span class="token punctuation">,</span><span class="token string">'affectataire'</span><span class="token punctuation">,</span><span class="token string">'usage'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><br>    tabs <span class="token operator">=</span>  pn<span class="token punctuation">.</span>Column<span class="token punctuation">(</span>pn<span class="token punctuation">.</span>pane<span class="token punctuation">.</span>Markdown<span class="token punctuation">(</span><span class="token string">' # '</span><span class="token operator">+</span>b<span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">,</span><br>            pn<span class="token punctuation">.</span>pane<span class="token punctuation">.</span>Markdown<span class="token punctuation">(</span><span class="token string">' ## Surfaces légales'</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>            pn<span class="token punctuation">.</span>Row<span class="token punctuation">(</span>pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Surface de Plancher'</span><span class="token punctuation">,</span> value<span class="token operator">=</span>b<span class="token punctuation">.</span>sdp<span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value} m2'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'28pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                    pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Surface Utile Brute'</span><span class="token punctuation">,</span> value<span class="token operator">=</span>b<span class="token punctuation">.</span>sub<span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value} m2'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'28pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                    pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Surface Utile Nette'</span><span class="token punctuation">,</span> value<span class="token operator">=</span>b<span class="token punctuation">.</span>sun<span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value} m2'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'28pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                    pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Ratio SUN/SUB'</span><span class="token punctuation">,</span> value<span class="token operator">=</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token operator">*</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span>sun<span class="token operator">/</span>b<span class="token punctuation">.</span>sub<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value} %'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'32pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                    pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Ratio SUN/PDT'</span><span class="token punctuation">,</span> value<span class="token operator">=</span><span class="token builtin">round</span><span class="token punctuation">(</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span>sun<span class="token operator">/</span>b<span class="token punctuation">.</span>pdtCount<span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value} m2'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'32pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                    <span class="token punctuation">)</span><span class="token punctuation">,</span><br>            pn<span class="token punctuation">.</span>Tabs<span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token string">'Occupation'</span><span class="token punctuation">,</span><br>            pn<span class="token punctuation">.</span>Column<span class="token punctuation">(</span><br>                pn<span class="token punctuation">.</span>pane<span class="token punctuation">.</span>Markdown<span class="token punctuation">(</span><span class="token string">" ## Taux d'occupation 2022-23"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>            pn<span class="token punctuation">.</span>Row<span class="token punctuation">(</span><br>                pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Nombre d\'Amphi'</span><span class="token punctuation">,</span> value<span class="token operator">=</span>b<span class="token punctuation">.</span>amphiCount<span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value}'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'28pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'tx occupation'</span><span class="token punctuation">,</span> value<span class="token operator">=</span>b<span class="token punctuation">.</span>tauxOccup<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'amphi'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value} %'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'28pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Nombre de Salle banalisé'</span><span class="token punctuation">,</span> value<span class="token operator">=</span>b<span class="token punctuation">.</span>sbCount<span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value}'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'28pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'tx occupation'</span><span class="token punctuation">,</span> value<span class="token operator">=</span>b<span class="token punctuation">.</span>tauxOccup<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token string">'sb'</span><span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value} %'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'28pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><br>                <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>            <span class="token punctuation">(</span><span class="token string">'Répartion'</span><span class="token punctuation">,</span>pn<span class="token punctuation">.</span>Column<span class="token punctuation">(</span><br>                pn<span class="token punctuation">.</span>pane<span class="token punctuation">.</span>Markdown<span class="token punctuation">(</span><span class="token string">' ## Répartition des Surfaces '</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                pn<span class="token punctuation">.</span>Row<span class="token punctuation">(</span><span class="token punctuation">(</span>type_chart<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                pn<span class="token punctuation">.</span>Row<span class="token punctuation">(</span>pn<span class="token punctuation">.</span>bind<span class="token punctuation">(</span>b<span class="token punctuation">.</span>chart<span class="token punctuation">,</span> type_chart<span class="token punctuation">)</span><span class="token punctuation">,</span> pn<span class="token punctuation">.</span>bind<span class="token punctuation">(</span>b<span class="token punctuation">.</span>dataFrame<span class="token punctuation">,</span> type_chart<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>            <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br>            <span class="token punctuation">)</span>          <br>    <span class="token keyword">return</span> tabs<br><span class="token keyword">def</span> <span class="token function">dash_builder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span><br>    select_site <span class="token operator">=</span> pn<span class="token punctuation">.</span>widgets<span class="token punctuation">.</span>Select<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Selectionnez un site'</span><span class="token punctuation">,</span> options<span class="token operator">=</span><span class="token builtin">list</span><span class="token punctuation">(</span>list_site<span class="token punctuation">)</span><span class="token punctuation">)</span><br>    select <span class="token operator">=</span> pn<span class="token punctuation">.</span>widgets<span class="token punctuation">.</span>Select<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Selectionnez un bâtiment'</span><span class="token punctuation">,</span> options<span class="token operator">=</span>pn<span class="token punctuation">.</span>bind<span class="token punctuation">(</span>list_bat<span class="token punctuation">,</span>select_site<span class="token punctuation">)</span><span class="token punctuation">)</span><br>    template <span class="token operator">=</span> pn<span class="token punctuation">.</span>template<span class="token punctuation">.</span>FastListTemplate<span class="token punctuation">(</span><br>        site<span class="token operator">=</span> <span class="token string">"DashPi"</span><span class="token punctuation">,</span><br>        title<span class="token operator">=</span> <span class="token string">"Dashboard immobilier"</span><span class="token punctuation">,</span><br>        sidebar<span class="token operator">=</span><span class="token punctuation">[</span>pn<span class="token punctuation">.</span>pane<span class="token punctuation">.</span>Markdown<span class="token punctuation">(</span><span class="token string">' # Un simple dashboard'</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                pn<span class="token punctuation">.</span>pane<span class="token punctuation">.</span>Markdown<span class="token punctuation">(</span><span class="token string">"D'après des extractions Abyla et SAP BO"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                select_site<span class="token punctuation">,</span><br>                select<span class="token punctuation">,</span><br>                <span class="token punctuation">]</span><span class="token punctuation">,</span><br>        main <span class="token operator">=</span>pn<span class="token punctuation">.</span>Column<span class="token punctuation">(</span><br>            pn<span class="token punctuation">.</span>bind<span class="token punctuation">(</span>siteName<span class="token punctuation">,</span> select_site<span class="token punctuation">)</span><span class="token punctuation">,</span><br>            pn<span class="token punctuation">.</span>Row<span class="token punctuation">(</span>pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">"Nombre de bâtiment(s)"</span><span class="token punctuation">,</span> value<span class="token operator">=</span>pn<span class="token punctuation">.</span>bind<span class="token punctuation">(</span>siteNbBat<span class="token punctuation">,</span>select_site<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value}'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'32pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                    pn<span class="token punctuation">.</span>indicators<span class="token punctuation">.</span>Number<span class="token punctuation">(</span>name<span class="token operator">=</span><span class="token string">'Surface de Plancher Totale'</span><span class="token punctuation">,</span> value<span class="token operator">=</span>pn<span class="token punctuation">.</span>bind<span class="token punctuation">(</span>siteSDP<span class="token punctuation">,</span>select_site<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token builtin">format</span><span class="token operator">=</span><span class="token string">'{value} m2'</span><span class="token punctuation">,</span>font_size<span class="token operator">=</span><span class="token string">'32pt'</span><span class="token punctuation">,</span>margin<span class="token operator">=</span><span class="token number">25</span><span class="token punctuation">,</span>styles<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">'text-align'</span><span class="token punctuation">:</span> <span class="token string">'center'</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>                    <span class="token punctuation">)</span><span class="token punctuation">,</span><br>            pn<span class="token punctuation">.</span>bind<span class="token punctuation">(</span>tab<span class="token punctuation">,</span> select<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>        header_background <span class="token operator">=</span><span class="token string">'#023047'</span><span class="token punctuation">,</span><br>    <span class="token punctuation">)</span><br>    <span class="token keyword">return</span> template<br>app <span class="token operator">=</span> dash_builder<span class="token punctuation">(</span><span class="token punctuation">)</span><br>app<span class="token punctuation">.</span>servable<span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
<h2>Le résultat</h2>
<p>Une fois l'application lancé via la commande 'panel serve dash.py' on peut accéder au dashboard en local :</p>
<p><img src="/images/dashpi-01.png" alt=""></p>
<p><img src="/images/dashpi-02.png" alt=""></p>
<p>Pour l'instant, ce PoC n'a pas vocation à être mis en ligne ni même à être utilisé en interne, mais c'était un side projet très intéressant à mener pour découvrir la lib panel et produire un dashboard en utilisant autre chose que powerBI.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Goodbye 2023, welcome 2024 !</title>
    <link href="https://www.nicolas-birckel.fr/posts/goodbye-2023-welcome-2024/"/>
    <pubDate>2024-01-08T10:52:55Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/goodbye-2023-welcome-2024/</id>
    <content type="html"><![CDATA[
      <p>Je vous souhaite une année 2024 épanouissante et riche en expériences !
2024 vient de commencer, c'est l'occasion de faire une liste des trucs cools passés en 2023 et de se projeter un peu dans 2024.</p>
<h2>2023 en quelques lignes</h2>
<ol>
<li>Mon CDD à l'Université a été à nouveau renouvelé !</li>
<li>J'ai publié 14 articles sur ce blog en 2023, à voir si je fais mieux en 2024.</li>
<li>J'ai obtenu ma nationalité luxembourgeoise.</li>
<li>L'apprentissage du luxembourgeois sans prendre de cours, c'est plus que compliqué :/</li>
<li>Le jardin a bien donné pour sa première année d'exploitation.</li>
<li>J'ai vélotaffé, mais moins que je l'aurais pensé.</li>
<li>Mon dossier de VAE a été validé administrativement et pédagogiquement.</li>
<li>Amazon Prime ne me manque pas.</li>
<li>Dropbox non plus.</li>
<li>En revanche j'arrive bientôt à court d'espace sur iCloud :/</li>
<li>L’expérience Nextcloud sur le raspi n'est pas vraiment concluante.</li>
<li>Les connecteurs de mon XT-20 sont officiellement décédés.</li>
<li>Je n'ai pas pris le temps de caler de shooting photos que souhaité en 2023.</li>
<li>On a refait la cuisine de l'appartement.</li>
<li>Je suis arrivé à la fin de la LOA de ma voiture.</li>
<li>Dont j'ai activé l'option d'achat car super affaire vu l'explosion du prix des voitures sur les 3 dernières années.</li>
<li>On a vu Matmatah en concert, et c'était bien sympa !</li>
<li>Mon meilleur ami est revenu vivre avec sa petite famille à Nancy.</li>
<li>Du coup on s'est plus vu, et c'est cool.</li>
<li>On a commencé 2023 par une rando des le 1er janvier.</li>
<li>On a retapé deux vieux meubles chinés.</li>
<li>On s'est inscrit dans une amap pour manger des légumes locaux et de saison.</li>
<li>Les manif contre la réforme de retraite c'était bonne ambiance.</li>
<li>On a emmené les enfants visiter des mines de fer du coin.</li>
<li>Et également Verdun.</li>
<li>Le spectacle de chorale de ma fille était sympa.</li>
<li>Tout comme son spectacle de théâtre.</li>
<li>Le géocaching pour motiver les enfants en rando ça marche très bien !</li>
<li>Pas de Covid cette année.</li>
<li>Ma mère est revenue de très loin suite à un accident cardiaque lors d'une opération.</li>
<li>On a fait de très belles randonnées dans les Vosges au printemps.</li>
<li>J'ai organisé une chasse au trésor en foret pour les 10 ans de mon fils.</li>
<li>C'est le meilleur anniversaire qu'il a fait d'après lui.</li>
<li>J'ai une souris ergonomique au bureau, ça change la vie.</li>
<li>J'ai appris à poser un toilette.</li>
<li>Je me suis mis au tricot.</li>
<li>J'ai donc offert des mitaines en laine à tout le monde ;)</li>
<li>J'ai revendu à regret mon 35mm car mon boitier ne le faisait plus fonctionner.</li>
<li>On a fait de belles balades en vélo avec mon fils.</li>
<li>Mes enfants apprennent à jouer à Street Fighter et c'est cool !</li>
<li>Je suis passé à une cafetière Pour Over, et j'aime beaucoup préparer du café avec.</li>
<li>On a passé plusieurs journées à visiter le Luxembourg.</li>
<li>Merci les transports en commun gratuits là haut.</li>
<li>J'ai appris à changer un roue.</li>
<li>Je prends de plus en plus de plaisir à bosser avec python et pandas.</li>
<li>Baldur Gate 3 était vraiment excellent.</li>
<li>Pour Noël et nouvel an, j'ai fait 6kg de pain d'épices. Et tout a été mangé !</li>
</ol>
<h2>Quelques envies et projets pour 2024</h2>
<ol>
<li>Maintenant que mon dossier de VAE est validé, en 2024 j'ai mon diplôme !</li>
<li>Je pense à passer une certification Python/Pandas.</li>
<li>Refaire de la photographie.</li>
<li>Réduire encore ma consommation de viande.</li>
<li>Faire de façon plus régulière du sport: j'hésite entre le badminton (via le boulot) ou l'escalade en bloc.</li>
<li>Arrêter définitivement de vapoter.</li>
<li>Documenter bien plus.</li>
</ol>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Créer des cartes d&#39;élevation en python avec ridge-map</title>
    <link href="https://www.nicolas-birckel.fr/posts/créer-des-cartes-délevation-en-python-avec-ridge-map/"/>
    <pubDate>2023-11-03T09:21:46Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/créer-des-cartes-délevation-en-python-avec-ridge-map/</id>
    <content type="html"><![CDATA[
      <p>En faisant ma veille technique je suis tombé sur la librairie <a href="https://pypi.org/project/ridge-map/">ridge-map</a> qui permet de tracer en python des cartes d’élévation en récupérant les données <a href="https://fr.wikipedia.org/wiki/Shuttle_Radar_Topography_Mission">SRTM</a> d'une zone donnée. Merci à <a href="https://fosstodon.org/@LisaHornung">Lisa Hornung</a> pour la découverte !</p>
<p>Je suis plutôt fan du rendu artistique obtenu sur les quelques tests que j'ai pu faire.</p>
<h2>Quelques exemples de rendus :</h2>
<p><img src="/images/20231103_1044_-puys_greys_r_l50_e100_v30_w8_h12.png" alt="Chaîne des Puys" title="Chaîne des Puys"></p>
<p><img src="/images/20231103_0924_beaufort_greys_r_l50_e202_v30_w8_h12.png" alt="La région de Beaufort" title="La région de Beaufort"></p>
<p><img src="/images/20231102_1548_mont-fuji_greys_r.png" alt="Le Mont Fuji" title="Le Mont Fuji"></p>
<h2>Le script python pour générer les cartes</h2>
<p>les imports : ridge_map bien sûr, matplotlib et datetime</p>
<pre class="language-python"><code class="language-python"><span class="token keyword">import</span> matplotlib<span class="token punctuation">.</span>pyplot <span class="token keyword">as</span> plt<br><span class="token keyword">from</span> ridge_map <span class="token keyword">import</span> RidgeMap<br><span class="token keyword">from</span> matplotlib <span class="token keyword">import</span> rcParams<br><span class="token keyword">from</span> datetime <span class="token keyword">import</span> datetime</code></pre>
<p>la déclaration de variables utilisées avec matplotlib : couleur de texte, de fond, police, titre de la carte,  l’échelle de couleur pour l’élévation et les dimensions de la figure.</p>
<p>Je crée également une variable date qui sera utilisée pour la sauvegarde du rendu.</p>
<p>Et surtout les variables pour ridge-map : nombre de lignes à tracer, nombre de points d'élévation, l'exagération de l'élévation et bien sur les coordonnées de la zone à tracer. Celles-ci sont récupérables via le site <a href="http://bboxfinder.com">http://bboxfinder.com</a></p>
<pre class="language-python"><code class="language-python">now <span class="token operator">=</span> datetime<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># current date and time</span><br>date <span class="token operator">=</span> now<span class="token punctuation">.</span>strftime<span class="token punctuation">(</span><span class="token string">"%Y%m%d_%H%M"</span><span class="token punctuation">)</span><br>cmaps <span class="token operator">=</span><span class="token string">"Greys_r"</span><br>textcolor<span class="token operator">=</span> <span class="token string">'#FAFAFA'</span><br>bgcolor <span class="token operator">=</span> <span class="token string">'#1c1c1c'</span><br>rcParams<span class="token punctuation">[</span><span class="token string">'font.family'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'Consolas'</span><br>title <span class="token operator">=</span> <span class="token string">"Chaîne des Puys"</span><br>width<span class="token operator">=</span><span class="token number">8</span><br>height<span class="token operator">=</span><span class="token number">12</span><br>coords <span class="token operator">=</span><span class="token punctuation">(</span><span class="token number">2.900391</span><span class="token punctuation">,</span><span class="token number">45.623643</span><span class="token punctuation">,</span><span class="token number">3.004761</span><span class="token punctuation">,</span><span class="token number">45.917721</span><span class="token punctuation">)</span> <span class="token comment"># récupérées via http://bboxfinder.com/</span><br>nlines <span class="token operator">=</span> <span class="token number">50</span> <span class="token comment">#le nombre de lignes tracées</span><br>elpts <span class="token operator">=</span><span class="token number">100</span> <span class="token comment">#le nombre de points d'élevation à utiliser par ligne</span><br>vratio <span class="token operator">=</span> <span class="token number">30</span> <span class="token comment"># l'exagération de l'élévation. Plus c'est élevé plus c'est éxagéré</span></code></pre>
<p>Le tracé avec ridge-map :</p>
<pre class="language-python"><code class="language-python">rm <span class="token operator">=</span> RidgeMap<span class="token punctuation">(</span>coords<span class="token punctuation">,</span> font<span class="token operator">=</span><span class="token string">"Consolas"</span><span class="token punctuation">)</span><br>values <span class="token operator">=</span> rm<span class="token punctuation">.</span>get_elevation_data<span class="token punctuation">(</span>num_lines<span class="token operator">=</span>nlines<span class="token punctuation">,</span> elevation_pts<span class="token operator">=</span>elpts<span class="token punctuation">)</span><br>fig<span class="token punctuation">,</span>ax <span class="token operator">=</span> plt<span class="token punctuation">.</span>subplots<span class="token punctuation">(</span>figsize<span class="token operator">=</span><span class="token punctuation">(</span>width<span class="token punctuation">,</span> height<span class="token punctuation">)</span><span class="token punctuation">)</span><br>fig<span class="token punctuation">.</span>set_facecolor<span class="token punctuation">(</span>bgcolor<span class="token punctuation">)</span><br>ridges <span class="token operator">=</span> rm<span class="token punctuation">.</span>plot_map<span class="token punctuation">(</span><br>    values<span class="token operator">=</span>rm<span class="token punctuation">.</span>preprocess<span class="token punctuation">(</span>values<span class="token operator">=</span>values<span class="token punctuation">,</span> vertical_ratio<span class="token operator">=</span>vratio<span class="token punctuation">,</span> water_ntile<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span>lake_flatness<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span><br>    ax<span class="token operator">=</span>ax<span class="token punctuation">,</span> kind<span class="token operator">=</span><span class="token string">'elevation'</span><span class="token punctuation">,</span> label<span class="token operator">=</span><span class="token boolean">None</span><span class="token punctuation">,</span><br>    linewidth<span class="token operator">=</span><span class="token number">1.2</span><span class="token punctuation">,</span><br>    line_color <span class="token operator">=</span> plt<span class="token punctuation">.</span>get_cmap<span class="token punctuation">(</span>cmap<span class="token punctuation">)</span><span class="token punctuation">,</span><br>    background_color <span class="token operator">=</span> bgcolor<br>    <span class="token punctuation">)</span></code></pre>
<p>On rajoute le titre, les coordonnées de la zone et quelques informations avec matplotlib :</p>
<pre class="language-python"><code class="language-python">plt<span class="token punctuation">.</span>figtext<span class="token punctuation">(</span><span class="token number">0.5</span><span class="token punctuation">,</span> <span class="token number">0.06</span> <span class="token punctuation">,</span> title<span class="token punctuation">,</span> fontsize<span class="token operator">=</span><span class="token number">28</span><span class="token punctuation">,</span> fontweight<span class="token operator">=</span><span class="token string">'bold'</span><span class="token punctuation">,</span> ha<span class="token operator">=</span><span class="token string">'center'</span><span class="token punctuation">,</span> color<span class="token operator">=</span>textcolor<span class="token punctuation">)</span><br>plt<span class="token punctuation">.</span>figtext<span class="token punctuation">(</span><span class="token number">0.5</span><span class="token punctuation">,</span> <span class="token number">0.04</span> <span class="token punctuation">,</span> coords<span class="token punctuation">,</span> fontsize<span class="token operator">=</span><span class="token number">8</span><span class="token punctuation">,</span> fontweight<span class="token operator">=</span><span class="token string">'light'</span><span class="token punctuation">,</span> ha<span class="token operator">=</span><span class="token string">'center'</span><span class="token punctuation">,</span> color<span class="token operator">=</span>textcolor<span class="token punctuation">)</span><br>plt<span class="token punctuation">.</span>figtext<span class="token punctuation">(</span><span class="token number">0.5</span><span class="token punctuation">,</span> <span class="token number">0.03</span> <span class="token punctuation">,</span> <span class="token string">'Data: NASA via ridge-map.py | Code &amp; Design by Nicolas Birckel '</span><span class="token punctuation">,</span> fontsize<span class="token operator">=</span><span class="token number">8</span><span class="token punctuation">,</span> fontweight<span class="token operator">=</span><span class="token string">'regular'</span><span class="token punctuation">,</span> ha<span class="token operator">=</span><span class="token string">'center'</span><span class="token punctuation">,</span> color<span class="token operator">=</span>textcolor<span class="token punctuation">)</span></code></pre>
<p>et pour finir on sauvegarde l'image, toujours avec matplotlib. J'ai choisi d'utiliser un nom de fichier plutôt verbeux intégrant les différentes variables pour pouvoir retrouver des réglages au besoin.</p>
<pre class="language-python"><code class="language-python">filename <span class="token operator">=</span> date<span class="token operator">+</span><span class="token string">"_"</span><span class="token operator">+</span>title<span class="token operator">+</span><span class="token string">"_"</span><span class="token operator">+</span>cmap<span class="token operator">+</span><span class="token string">"_l"</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span>nlines<span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"_e"</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span>elpts<span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"_v"</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span>vratio<span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"_w"</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span>width<span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"_h"</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span>height<span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">".png"</span><br>plt<span class="token punctuation">.</span>savefig<span class="token punctuation">(</span>filename<span class="token punctuation">,</span> dpi<span class="token operator">=</span><span class="token number">120</span><span class="token punctuation">,</span> bbox_inches<span class="token operator">=</span><span class="token string">'tight'</span><span class="token punctuation">,</span>pad_inches<span class="token operator">=</span><span class="token number">0.2</span><span class="token punctuation">,</span> facecolor<span class="token operator">=</span>bgcolor<span class="token punctuation">)</span></code></pre>
<h2>D'autre ressources pour jouer avec des cartes sur le web ou en python :</h2>
<ul>
<li>City roads, un site qui permet de tracer toutes les routes d'une ville : <a href="https://anvaka.github.io/city-roads/">https://anvaka.github.io/city-roads/</a></li>
<li>Du même développeur, Peak map qui permet de tracer des élévations <a href="https://anvaka.github.io/peak-map/#7.68/47.727/-122.574">https://anvaka.github.io/peak-map/#7.68/47.727/-122.574</a></li>
<li>Le <a href="https://github.com/search?q=30%20day%20map%20challenge&amp;type=repositories">30 day map challenge</a> sur github</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Photoctober 2023</title>
    <link href="https://www.nicolas-birckel.fr/posts/photoctober-2023/"/>
    <pubDate>2023-10-03T12:04:26Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/photoctober-2023/</id>
    <content type="html"><![CDATA[
      <p>Vous connaissez certainement l<a href="https://inktober.com/">'inktober</a>, mais savez vous qu'il existe un pendant photographique ?</p>
<p>Je suis tombé sur <a href="https://piaille.fr/@yanncphoto/111075892308059057">un toot de Yann Chemineau</a> présentant les thématiques de cet exercice photographique.</p>
<p>C'est l'occasion de dépoussiérer son appareil photo ou de reparcourir ses anciens clichés pour partager ceux-ci suivant l'un ou les deux thèmes du jour !</p>
<p>Yann a partagé ceux-ci, ainsi qu'une FAQ sur le Photoctober, sous forme d'images (avec les alt bien entendu). Je vous les remets ci-dessous sous forme textuelle.</p>
<h2>les thèmes</h2>
<table>
<thead>
<tr>
<th>Jour</th>
<th>thème 1</th>
<th style="text-align:right">thème 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>À dominante rouge</td>
<td style="text-align:right">Interdit</td>
</tr>
<tr>
<td>2</td>
<td>Ancien souvenir</td>
<td style="text-align:right">Verticales</td>
</tr>
<tr>
<td>3</td>
<td>Silencieux</td>
<td style="text-align:right">Pâtisserie</td>
</tr>
<tr>
<td>4</td>
<td>Plat et rond</td>
<td style="text-align:right">Vide</td>
</tr>
<tr>
<td>5</td>
<td>Film</td>
<td style="text-align:right">Bizarre</td>
</tr>
<tr>
<td>6</td>
<td>Chaud</td>
<td style="text-align:right">Étoile</td>
</tr>
<tr>
<td>7</td>
<td>Porte</td>
<td style="text-align:right">Oiseau</td>
</tr>
<tr>
<td>8</td>
<td>Mur</td>
<td style="text-align:right">J'me suis fait tout p'tit</td>
</tr>
<tr>
<td>9</td>
<td>Agriculture</td>
<td style="text-align:right">Obscurité</td>
</tr>
<tr>
<td>10</td>
<td>Rime avec &quot;dix&quot;</td>
<td style="text-align:right">Météo</td>
</tr>
<tr>
<td>11</td>
<td>Voir de haut</td>
<td style="text-align:right">À l'envers à l'endroit</td>
</tr>
<tr>
<td>12</td>
<td>Sur la route</td>
<td style="text-align:right">Panoramique</td>
</tr>
<tr>
<td>13</td>
<td>Rayures</td>
<td style="text-align:right">Loin</td>
</tr>
<tr>
<td>14</td>
<td>Photo floue</td>
<td style="text-align:right">Panneau</td>
</tr>
<tr>
<td>15</td>
<td>Petit-déjeuner</td>
<td style="text-align:right">Montagne</td>
</tr>
<tr>
<td>16</td>
<td>Noeud</td>
<td style="text-align:right">Ustensile de cuisine</td>
</tr>
<tr>
<td>17</td>
<td>Un nombre premier</td>
<td style="text-align:right">Premier plan floue</td>
</tr>
<tr>
<td>18</td>
<td>Invisible</td>
<td style="text-align:right">Ciel breton</td>
</tr>
<tr>
<td>19</td>
<td>Bruyant</td>
<td style="text-align:right">Figé dans le temps</td>
</tr>
<tr>
<td>20</td>
<td>Drôle</td>
<td style="text-align:right">Nourriture</td>
</tr>
<tr>
<td>21</td>
<td>Reflet</td>
<td style="text-align:right">Croisement</td>
</tr>
<tr>
<td>22</td>
<td>Prise en 2022</td>
<td style="text-align:right">Vélo</td>
</tr>
<tr>
<td>23</td>
<td>Double symétrie</td>
<td style="text-align:right">Low-tech</td>
</tr>
<tr>
<td>24</td>
<td>Prise au travail</td>
<td style="text-align:right">Arche</td>
</tr>
<tr>
<td>25</td>
<td>Noir et blanc</td>
<td style="text-align:right">Quelquechose que tu as cuisiné</td>
</tr>
<tr>
<td>26</td>
<td>Pluvieux</td>
<td style="text-align:right">Prise à l'étranger</td>
</tr>
<tr>
<td>27</td>
<td>Une seule personne</td>
<td style="text-align:right">Que tu peux entendre</td>
</tr>
<tr>
<td>28</td>
<td>Jeunesse</td>
<td style="text-align:right">Prise aujourd'hui</td>
</tr>
<tr>
<td>29</td>
<td>Coucher de soleil</td>
<td style="text-align:right">Jardin extraordinaire</td>
</tr>
<tr>
<td>30</td>
<td>Plage</td>
<td style="text-align:right">Flamme</td>
</tr>
<tr>
<td>31</td>
<td>Horloge</td>
<td style="text-align:right">Science</td>
</tr>
</tbody>
</table>
<p>Et en bonus 31 : une photo avec au moins 3 thèmes ci-dessus au choix.</p>
<p>N'hésitez pas à partager vos clichés en utilisant le hashtag #photoctober2023 sur Mastodon !</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Ech sinn Lëtzebuerger ! </title>
    <link href="https://www.nicolas-birckel.fr/posts/ech-sinn-lëtzebuerger/"/>
    <pubDate>2023-09-13T14:16:21Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/ech-sinn-lëtzebuerger/</id>
    <content type="html"><![CDATA[
      <p>M﻿oien !</p>
<p>U﻿n post plutôt perso aujourd'hui pour vous parler de mon recouvrement de la nationalité luxembourgeoise, que j'ai obtenu officiellement début septembre.</p>
<h2>P﻿ourquoi avoir fait la demande ?</h2>
<p>L﻿e côté maternel de ma famille vient du <a href="https://fr.wikipedia.org/wiki/Pays_Haut">Pays Haut</a>, plus particulièrement du Pays Haut Val d’Alzette bordant la frontière belgo-luxembourgeoise. Au cours de discussions familiales, il est ressorti qu'un de mes aïeuls était luxembourgeois et qu'avec les différentes annexations de la Moselle par les allemands, la nationalité luxembourgeoise s'est perdue au profit de la nationalité française.</p>
<p>L﻿e Luxembourg proposant de recouvrir la nationalité si un aïeul était luxembourgeois avant 1900, ma mère et moi avons donc entamé les démarches. Ma mère l'a obtenue l'année dernière, après quelques démarches généalogiques. J'ai pu pour ma part l'obtenir plus facilement par filiation direct et mes enfants en ont bénéficié automatiquement.</p>
<h2>E﻿t ça change quoi ?</h2>
<p>I﻿l n'y a pas réellement d'intérêt à avoir la double nationalité. C'était surtout une démarche de mémoire, pour que cette origine familiale ne se perde pas à nouveau.</p>
<p>C﻿ela m'a fait également m'intéresser plus en profondeur à ce pays frontalier et m'a donné envie d'en apprendre plus sur son histoire et sa langue. Ce sont deux thématiques qui sont obligatoires normalement pour les étrangers vivants au Luxembourg et qui souhaitent en acquérir la nationalité.</p>
<h2>A﻿pprendre le luxembourgeois ?!</h2>
<p>Je me souviens entendre ma grand-mère maternel le parler avec mon grand-père lorsqu'elle ne souhaitait pas qu'on comprenne de quoi ils parlaient lors des repas de famille. Ma trajectoire de vie actuelle me rapproche du Pays Haut et je risque de passer de plus en plus de temps au Luxembourg les week-end, alors pourquoi pas apprendre la langue !</p>
<p>J﻿'ai trouvé deux ressources pour :</p>
<p>L﻿a plateforme <a href="https://llo.lu/fr/">LLO.lu</a> de l'Institut National des Langues Luxembourg qui propose des modules d'e-learning de A1- à C2, beaucoup de contenu sur la culture luxembourgeoise, des café langues, etc.</p>
<p>L﻿a chaine <a href="https://www.youtube.com/playlist?list=PLTkPi_KFrmJOWoYIU5m2OWfCgLOYqZ8nq">Lëtzebuergesch mam Leslie</a> sur youtube qui propose une playlist de cours d'apprentissage du luxembourgeois.</p>
<p>la route va être longue pour atteindre un niveau B1 et réussir à communiquer oralement en luxembourgeois</p>
<p>Ä﻿ddi !</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Une bibliothèque de jeux vidéos dans Notion</title>
    <link href="https://www.nicolas-birckel.fr/posts/une-bibliothèque-de-jeux-vidéos-dans-notion/"/>
    <pubDate>2023-06-19T10:13:07Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/une-bibliothèque-de-jeux-vidéos-dans-notion/</id>
    <content type="html"><![CDATA[
      <p>Dernièrement, j'ai voulu me créer un système pour tenir à jour ma bibliothèque de jeux vidéos, comme je le faisais il y a quelques années sous Trello. J'ai décidé de faire ça dans Notion que j'utilise de plus en plus.</p>
<p><img src="/images/notion-personal-games-library.png" alt=""></p>
<h2>Ce que je voulais pour ma bibliothèque de jeux</h2>
<ul>
<li>pouvoir afficher les jeux en cours,</li>
<li>avoir une liste complète de mes jeux, avec quelques infos d'affichées : plateforme, l'état (fini, en stock, en cours, etc), un rating, etc.</li>
<li>filtrer cette liste par console, par état, etc.</li>
<li>ajouter facilement un jeu ou une console,</li>
<li>avoir des statistiques par console.</li>
</ul>
<p>Une fois tout cela en tête, j'ai pu chercher comment réaliser cela dans Notion.</p>
<h2>Deux bases de données pour tous les gouverner</h2>
<p>J'ai créer deux bases de données dans Notion : Une pour les consoles, l'autre pour les jeux avec l'idée de pouvoir utiliser les propriétés de liens entre base de données de Notion.</p>
<p>La structure de la base console :</p>
<table>
<thead>
<tr>
<th>name</th>
<th>Games list</th>
<th>nombre de jeux</th>
<th>pourcentage de jeux finis</th>
<th>pourcentage de jeux platinés</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>rempli automatiquement depuis la base jeux</td>
<td>calculé</td>
<td>calculé</td>
<td>calculé</td>
</tr>
</tbody>
</table>
<p>Et celle de la base jeux :</p>
<table>
<thead>
<tr>
<th>name</th>
<th>status</th>
<th>platiné</th>
<th>rating</th>
<th>Avis</th>
<th>Plateforme</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>select dans une liste</td>
<td>checkbox</td>
<td>select dans une liste</td>
<td></td>
<td>selectionné  dans la base console</td>
</tr>
</tbody>
</table>
<h2>Un même jeu de données, tant d'affichages possibles</h2>
<p>Un des gros avantages de Notion est le nombre de vues possibles pour l'affichage des données :</p>
<p><img src="/images/notion-data-views.png" alt=""></p>
<p>J'ai choisi d'utiliser la &quot;Gallery view&quot; dans ce projet car c'est celle qui me semble la plus adaptée visuellement pour une bibliothèque.</p>
<p>Cette vue est dupliquée plusieurs fois et les nouvelles vues sont filtrées pour pouvoir afficher les jeux par plateforme, ceux terminés, etc.</p>
<h2>Un bouton magique pour ajouter un jeu ou une console</h2>
<p>Une des dernières mises à jour de Notion a introduit les boutons.
Ce nouveau bloc avancé permet d'exécuter une automatisation d'actions dans Notion.</p>
<p>J'ai créé deux boutons dans la page principale : un pour ajouter un jeu, l'autre pour ajouter une console.</p>
<p><img src="/images/notion-add-a-game.png" alt=""></p>
<p>Les deux fonctionnent de la même manière : au clic, il ajoute une entrée dans la base de données concernée en s'appuyant sur le modèle de page par défaut de celle-ci, puis ouvre la page créée pour remplir les informations du jeu ou de la console.</p>
<p>Cela permet d'ajouter des données directement depuis la page principale sans avoir à aller dans la table de données.</p>
<h2>Envie de l'essayer ?</h2>
<p>Si vous souhaiter l'essayer, le template est disponible gratuitement sur Gumroad : <a href="https://nbirckel.gumroad.com/l/kowtl">Notion Personal Games Library</a></p>
<p>Je suis preneur de vos retours et idées d'amélioration sur Mastodon : <a href="https://mastodon.social/@nbirckel">https://mastodon.social/@nbirckel</a></p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Le matériel et les logiciels que j&#39;utilise en 2023</title>
    <link href="https://www.nicolas-birckel.fr/posts/le-matériel-et-les-logiciels-que-jutilise-en-2023/"/>
    <pubDate>2023-06-15T10:28:40Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/le-matériel-et-les-logiciels-que-jutilise-en-2023/</id>
    <content type="html"><![CDATA[
      <p>Dans cet article, vous trouverez tout le matériel et les logiciels que j’utilise à titre perso au quotidien ou presque.
Si vous avez des questions, n’hésitez pas à me les poser sur <a href="https://mastodon.social/@nbirckel">Mastodon</a>.</p>
<h2>Hardware</h2>
<ul>
<li><strong>iPad Pro 10,5 (2017)</strong> : ma machine à tout faire, accompagnée de son clavier Logitech Combo Touch et d'un Apple Pencil.</li>
<li><strong>iPhone XR (2018)</strong> : il marche toujours aussi bien et la batterie tiens encore quasiment la journée, aucune raison d'en changer !</li>
<li><strong>Raspberry Pi 3 model B</strong> : tournant sous dietPi. mon cloud perso est installé dessus.</li>
<li><strong>Fujifilm XT-20</strong> : mon fidèle mirrorless, qui commence à présenter de gros signes de fatigue :/</li>
</ul>
<p>J'ai également un macbook pro early 2015, mais que je n'utilise plus.</p>
<h2>Logiciels et outils</h2>
<h3>Communication</h3>
<ul>
<li><strong>Slack</strong> : pour garder le contact avec deux communautés de designers et de dev front francophone.</li>
<li><strong>Spark</strong> : l'un des meilleurs clients email que j'ai eu l'occasion de tester sur iOS, il est installé sur l'iPad et sur l'iPhone.</li>
<li><strong>Metatext</strong> : mon client préféré pour mastodon, mais celui-ci n'est plus maintenu. Je suis preneur de recommandation pour le remplacer.</li>
<li><strong>Discord</strong> : Pour les sessions de JDR en ligne avec des amis et pour deux communautés autour des jeux Diablo 2 et Diablo 4.</li>
</ul>
<h3>Cloud</h3>
<ul>
<li><strong>Nextcloud</strong> : une solution de cloud open source, qui tourne sur mon RaspberryPi.</li>
<li><strong>iCloud</strong> : le cloud d'Apple, tellement pratique lorsqu'on est dans un environnement full Apple.</li>
</ul>
<h3>Bureautique</h3>
<ul>
<li><strong>Keynotes</strong> : le Powerpoint d'Apple.</li>
<li><strong>Pages</strong> : le Word d'Apple.</li>
<li><strong>Numbers</strong> : l'Excel d'Apple.</li>
<li><strong>FreeForm</strong> : l'outil de tableau blanc d'iOS 16,très pratique pour faire des schémas et du mindmapping.</li>
<li><strong>M﻿arkdown Editor and Reader</strong> : Pour écrire du markdown sur l'Ipad</li>
</ul>
<h3>Montage vidéo</h3>
<ul>
<li><strong>Lumafusion</strong> : avant de découvrir cet outil lors de la certification journalisme mobile des Gobelins, je ne pensais pas qu'il était possible de faire du montage vidéo avancé sur iPad.</li>
</ul>
<h3>Photographie</h3>
<ul>
<li><strong>Photos</strong> : la photothèque d'Apple, qui prend en charge les raw Fujifilm sur iPadOS et bénéficie de la synchronisation iCloud.</li>
<li><strong>Affinity Photo</strong> : Mon logiciel fétiche de développement et de retouche photo sur iPad.</li>
<li><strong>Photopils</strong> : pour planifier mes shootings en extérieur.</li>
<li><strong>Pixelfed</strong> : pour publier mes photos, en remplacement d'Instagram que j'abandonne.</li>
</ul>
<h3>Création graphique</h3>
<ul>
<li><strong>Affinity Designer</strong> : un autre logiciel de chez Serif, orienté vectoriel.</li>
<li><strong>Procreate</strong> : y a-t-il besoin de présenter cette app ?</li>
</ul>
<h3>Code et hébergement web</h3>
<ul>
<li><strong>Codesandbox</strong> : Une plateforme de développement dans le cloud qui me permet de coder sur l'iPad.</li>
<li><strong>GitHub</strong> : pour stocker et faire le versioning de mon code, de mon site web, etc.</li>
<li><strong>OVH</strong> : pour gérer mes noms de domaines et mes mails.</li>
<li><strong>Netlify</strong> : pour déployer et héberger mon site statique à chaque commit sur GitHub.</li>
</ul>
<h3>Productivité et organisation</h3>
<ul>
<li><strong>Notion</strong> : ma petite knowledge base perso, j'y documente plein de choses : de la planification de voyage à ma ludothèque en passant par un livre de recette.</li>
<li><strong>Bitwarden</strong> : mon gestionnaire de mot de passe favori après l'abandon de miniKeepPass sur iOS.</li>
<li><strong>Raindrop.io</strong> : Un super gestionnaire de bookmarks/quotes/etc.</li>
<li><strong>Notes et Rappels</strong> : Applications de bases d'iOS dont les options de partages sont bien pratiques, notamment les notes et listes partagées avec madame.</li>
<li><strong>Tricount</strong> : partager des frais entre amis n'a jamais été aussi facile.</li>
</ul>
<h3>Lecture et Musique</h3>
<ul>
<li><strong>iBook</strong> : l'application de livres d'Apple. Je ne lis que des livres techniques ou non fictionnels sur iPad, les romans je les préfère en papier.</li>
<li><strong>Baobab</strong> : l'application de livres numériques de la médiathèque.</li>
<li><strong>Smart Comic</strong> : pour les comics et les mangas.</li>
<li><strong>Apple Music</strong> : pour tout les DJ sets techno disponible dessus.</li>
<li><strong>Apple Podcast</strong> : pour les Podcasts.</li>
</ul>
<h3>Veille et flux RSS</h3>
<ul>
<li><strong>NetNewsWire</strong> : un client RSS plutôt bien fichu sur iPad.</li>
</ul>
<h3>Autres</h3>
<ul>
<li><strong>Visorando</strong>  : pour planifier mes randonnées et enregistrer mes traces GPS.</li>
<li><strong>Géocaching</strong> : pour motiver les enfants lors des randonnées, ça marche plutôt bien ;)</li>
<li><strong>LLO</strong> : l'application officielle du site LLO.lu dédié à l'apprentissage de la langue luxembourgeoise.</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Retour sur le mois de mai et le début de juin</title>
    <link href="https://www.nicolas-birckel.fr/posts/retour-sur-le-mois-de-mai-et-le-début-de-juin/"/>
    <pubDate>2023-06-13T08:23:20Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/retour-sur-le-mois-de-mai-et-le-début-de-juin/</id>
    <content type="html"><![CDATA[
      <p>Bien le bonjour !</p>
<p>C'est déjà la moitié du mois de juin. Il est donc temps de vous raconter un peu ce qui s'est passé en mai et lors de ce début de mois. Cela sera un peu plus court que d'habitude, je n'ai rien à écrire coté photo.</p>
<h2>Pro</h2>
<p>Changement de matos au boulot ! J'ai enfin un laptop correct qui me permet de prendre en main Revit pour nos maquettes BIM 3D de bâtiment et je peux enfin télétravailler de temps en temps ;)</p>
<p>J'en ai profité également pour me faire commander une souris ergonomique, une Logitech Lift. C'est plutôt plaisant à utiliser et la prise en main est assez rapide.</p>
<p>Je continue l'apprentissage de python qui prend une place de plus en plus importante dans mon travail, tant pour la concaténation de données que pour leur exploitation.</p>
<p>Je me suis créé un petit jeu de données issu de notre système d'information du patrimoine, stockés en local dans une MongoDB. Cela me permet de tester des trucs : créer une API avec FastApi et Uvicorn, expérimenter des scripts pour sortir des années de référence pour nos consommations d'énergie, etc.</p>
<h2>Perso</h2>
<p>Cela fait un an que nous avons emménagés dans ce nouvel appartement et les efforts de l'année écoulée pour transformer la terrasse de cailloux et remblais en un espace vert portent leurs fruits !</p>
<p>Les 4 bacs débordent de légumes en train de pousser, et l'herbe a bien poussée. Même ce qui a été planté en pleine terre semble avoir bien pris, malgré la faible profondeur de celle-ci. dernière plantation en date, 2 pieds femelles et 1 pied male d'actinidia, qui profitent bien de l'ensoleillement plein sud de la terrasse.</p>
<p>Le mois de mai a également été l'occasion de belles randonnées sur le secteur et dans les Vosges.</p>
<h2>Lecture et jeu vidéo</h2>
<p>Diablo 4 est sorti et il va occuper ma ps5 un bon bout de temps je pense ;) J'ai commencé un nécromancien, avec lequel j'ai déjà plié la campagne. Le scénario de celle-ci est plutôt bien écrit, et l'épilogue laisse l'histoire suffisament ouverte pour une future extension.</p>
<p>J'attends des amis qui sont encore en train de faire la campagne du jeu pour ensuite rentrer dans le dur du contenu end-game.</p>
<p>J'ai lu <em>Outresable</em> de Hugh Howey. Un style plutôt agréable à lire, je tenterai donc <em>Silo</em> si il est disponible à la médiathèque.</p>
<p>La lecture de <em>L'essentialisme</em> de Greg Mckeown est enfin finie. Y a de bonnes idées à prendre dedans, mais le style d'écriture des auteurs américains de livre de développement personnel est tellement chiant.</p>
<p>Äddi !</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Mars et Avril, d&#39;un coup.</title>
    <link href="https://www.nicolas-birckel.fr/posts/mars-et-avril-dun-coup/"/>
    <pubDate>2023-05-10T14:00:59Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/mars-et-avril-dun-coup/</id>
    <content type="html"><![CDATA[
      <p>Moien ! Wié geet et dir ?</p>
<p>On est déjà en mai, et je me rend compte que je n'ai pas tenu mon petit récap' mensuel... C'est donc double dose : un billet pour mars et avril, d'un coup.</p>
<h2>Côté pro</h2>
<p>Le travail sur la mise en place du BIM continue son chemin, on enchaine les ateliers de travail et les visio avec d'autre établissements à un rythme plutôt soutenu. Comme dans la parodie de Koh Lanta du Palma Show, j'ai l'impression que quelqu'un crie de temps en temps &quot;Attention, nouvelle règle !&quot; au fur et à mesure que l'on avance.<br>
La dernière en date ? Devoir changer dès à présent de Système d'Information du Patrimoine car celui-ci n'est plus maintenu dans la version que nous utilisons suite au rachat du prestataire...</p>
<p>Je continue de mon côté d'apprendre et d'expérimenter en Python pour continuer d'outiller notre pôle SIP dans la gestion et la qualité de ses données.</p>
<h2>C﻿ôté perso</h2>
<p>Encore des congés scolaire en avril, ce fut l'occasion de passer un semaine avec les enfants à profiter des randonnées et ballades du coin, malgré le temps maussade. Nous sommes aussi allés visiter la Citadelle de Verdun ainsi que le fort de Douaumont, qui fait partie du système de défense Séré de Rivières (dont on trouve plein de fortification par chez moi) et fut fortement bombardé durant la Première Guerre Mondiale.</p>
<p>J'ai également mis à profit mes vacances pour aller déposer mon dossier de recouvrement de nationalité luxembourgeoise par l'option à Luxembourg-Ville, ma mère ayant recouvert la sienne l'année dernière. Mon dossier étant complet, je serai, normalement, franco-luxembourgeois en août. Et je m'attaque donc à l'apprentissage de la langue.</p>
<h2>C﻿ôté Photo</h2>
<p>Grosse pause photographique, suite à de nombreuses mésaventures d'organisation de shooting. Entre lapins, changement d'avis et ghosting, j'ai levé le pied le temps de retrouver l'énergie nécessaire à ma pratique photographique. Et la météo des deux derniers mois n'a pas aidé, j'ai hâte de pouvoir à nouveau shooter en extérieur.</p>
<h2>C﻿ôté lecture et jeu vidéo</h2>
<p>Gros retour de la licence Diablo dans mon temps libre entre la béta de Diablo 4 et un élan de motivation pour monter un barbare MF sur Diablo 2. Après des mois à vide résultant de la claque vidéo-ludique Elden Ring, j'ai enfin rallumé ma PS5. Et ça fait du bien ;)</p>
<p>J'ai fini quelques bouquins aussi :</p>
<ul>
<li><em>Influence et manipulation</em> de Robert Cialdin,</li>
<li><em>Des fleurs pour Algernon</em> de Daniel Keyes ,</li>
<li><em>Les hérétiques de Dune</em> de Frank Herbert.</li>
</ul>
<p>Äddi !</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Quelques ressources pour se mettre à Python</title>
    <link href="https://www.nicolas-birckel.fr/posts/quelques-ressources-pour-se-mettre-à-python/"/>
    <pubDate>2023-04-11T07:45:31Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/quelques-ressources-pour-se-mettre-à-python/</id>
    <content type="html"><![CDATA[
      <p>Quelques ressources que j'ai trouvées utiles pour découvrir le langage Python :</p>
<h3>Codecademy :</h3>
<p>Codecademy propose une introduction interactive à Python en ligne. La plateforme offre des leçons interactives, des projets pratiques et des quiz pour aider les apprenants à maîtriser la syntaxe de base de Python.</p>
<p><a href="https://www.codecademy.com/learn/learn-python">https://www.codecademy.com/learn/learn-python</a></p>
<h3>Le livre &quot;Apprenez à programmer en Python&quot; :</h3>
<p>Ce livre est une excellente ressource pour les débutants qui souhaitent apprendre Python. Il couvre les concepts de base et propose des projets pratiques pour aider les apprenants à appliquer leurs connaissances.</p>
<p><a href="https://www.editions-eyrolles.com/Livre/9782212678459/apprenez-a-programmer-en-python-2e-edition">https://www.editions-eyrolles.com/Livre/9782212678459/apprenez-a-programmer-en-python-2e-edition</a></p>
<h3>Le site Web de Python.org :</h3>
<p>Python.org est le site Web officiel de la communauté Python. Il propose de la documentation, des guides de démarrage rapide et une variété de ressources pour les développeurs de tous niveaux.</p>
<p><a href="https://www.python.org/">https://www.python.org/</a></p>
<h3>Le cours &quot;Introduction à Python&quot; de Google :</h3>
<p>Google propose un cours en ligne gratuit pour les débutants qui souhaitent apprendre Python. Il comprend des vidéos, des quiz et des projets pratiques pour aider les apprenants à renforcer leurs compétences en Python.</p>
<p><a href="https://developers.google.com/edu/python/">https://developers.google.com/edu/python/</a></p>
<h3>Le mooc :  Python : des fondamentaux aux concepts avancés du langage sur Fun-Mooc</h3>
<p>D﻿'une durée de 9 semaines, il donne les bases pour apprendre à bien programmer en Python, à écrire rapidement des programmes efficaces, faciles à comprendre et à maintenir qui exploitent pleinement les possibilités du langage !</p>
<p><a href="https://www.fun-mooc.fr/fr/cours/python-3-des-fondamentaux-aux-concepts-avances-du-langage/">https://www.fun-mooc.fr/fr/cours/python-3-des-fondamentaux-aux-concepts-avances-du-langage/</a></p>
<p>V﻿ous avez d'autres ressources pertinentes à ajouter à cette liste ?</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Calcul de ratio de surface et détection des bâtiments dit de bureaux avec Python et Pandas</title>
    <link href="https://www.nicolas-birckel.fr/posts/calcul-de-ratio-de-surface-et-détection-des-bâtiments-dit-de-bureaux-avec-python-et-pandas/"/>
    <pubDate>2023-04-04T09:29:59Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/calcul-de-ratio-de-surface-et-détection-des-bâtiments-dit-de-bureaux-avec-python-et-pandas/</id>
    <content type="html"><![CDATA[
      <p>À l'université , je gère le jeu de données alphanumériques de 258 bâtiments de l'Enseignement Supérieur et de la Recherche dans un outil de Gestion Technique Patrimonial (GTP) qui permet de gérer les plans de nos bâtiments et d'y liés les données relatives.</p>
<p>C﻿ette GTP permet d'interroger via un requêteur les attributs liés à des composants (bâtiments, local, équipements,...) et des tables métiers (Surfaces légales ou Affectataires par exemple) mais ne me permet pas actuellement de faire de l'analytique ou de calculer des ratios pour ensuite mettre à jour des attributs.</p>
<p>D﻿ans le cadre de l'amélioration continue de mon jeu de données, j'ai voulu calculer certains ratios dont mes collègues ont besoins pour leurs opérations :</p>
<ul>
<li>u﻿n ratio Surface Utile Brut (SUB)/ Surface Utile Nette (SUN) qui nous sert à identifier les bâtiments à dominante &quot;bureau&quot; au sein de notre patrimoine universitaire,</li>
<li>u﻿n ratio SUN/ poste de travail qui permet d'apprécier la rationalisation des surfaces de bureaux (avec un objectif de 12m2 par poste de travail.)</li>
</ul>
<p>et  les ajouter dans des attributs de mes bâtiments afin que tout le monde puisse y avoir accès depuis la GTP.</p>
<h3>L﻿e jeu de données de base</h3>
<p>J﻿'ai créé une requête dans la GTP pour extraire les données de l'attribut 'nombre de poste de travail'  de chaque bâtiment ainsi que les codes surface et surface calculée depuis la table métier correspondante.</p>
<p>C﻿ela ressort un fichier Excel structuré comme cela :</p>
<table>
<thead>
<tr>
<th style="text-align:left">Bâtiment</th>
<th style="text-align:center">Nombre de poste de travail</th>
<th style="text-align:center">Code surface</th>
<th style="text-align:center">Surface calculée</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Bâtiment A</td>
<td style="text-align:center">78</td>
<td style="text-align:center">SDP</td>
<td style="text-align:center">2 890,57</td>
</tr>
<tr>
<td style="text-align:left">Bâtiment A</td>
<td style="text-align:center">78</td>
<td style="text-align:center">SHOB</td>
<td style="text-align:center">3917,27</td>
</tr>
<tr>
<td style="text-align:left">Bâtiment A</td>
<td style="text-align:center">78</td>
<td style="text-align:center">SHON</td>
<td style="text-align:center">3272,12</td>
</tr>
<tr>
<td style="text-align:left">Bâtiment A</td>
<td style="text-align:center">78</td>
<td style="text-align:center">SUB</td>
<td style="text-align:center">2713,04</td>
</tr>
<tr>
<td style="text-align:left">Bâtiment A</td>
<td style="text-align:center">78</td>
<td style="text-align:center">SUN</td>
<td style="text-align:center">696,41</td>
</tr>
<tr>
<td style="text-align:left">Bâtiment B</td>
<td style="text-align:center">60</td>
<td style="text-align:center">SDP</td>
<td style="text-align:center">1344,85</td>
</tr>
</tbody>
</table>
<p>1﻿291 lignes, avec pas mal d'informations en doublon et une structure qui ne permet pas de faire facilement mes calculs de ratio.</p>
<h3>Mon script python, décortiqué</h3>
<pre class="language-python"><code class="language-python"><span class="token keyword">import</span> pandas <span class="token keyword">as</span> pd</code></pre>
<p>O﻿n importe la lib Pandas, qui va nous permettre de manipuler, nettoyer et structurer nos données.</p>
<pre class="language-python"><code class="language-python">df<span class="token operator">=</span> pd<span class="token punctuation">.</span>read_excel<span class="token punctuation">(</span><span class="token string">'export_GTP.xls'</span><span class="token punctuation">)</span></code></pre>
<p>O﻿n crée un dataFrame avec les données lues depuis le fichier Excel exporté depuis la GTP.</p>
<pre class="language-python"><code class="language-python">df2<span class="token operator">=</span> df<span class="token punctuation">.</span>pivot_table<span class="token punctuation">(</span>index<span class="token operator">=</span><span class="token string">'Bâtiment'</span><span class="token punctuation">,</span> columns<span class="token operator">=</span><span class="token string">'Code surface'</span><span class="token punctuation">,</span> values<span class="token operator">=</span><span class="token string">'Surface calculée'</span><span class="token punctuation">)</span><br>df2<span class="token operator">=</span> df2<span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre>
<p>O﻿n pivote le dataFrame pour avoir les bâtiments en index et les valeurs de Code surface en colonnes et on le duplique dans un second dataFrame.</p>
<pre class="language-python"><code class="language-python">df<span class="token punctuation">.</span>drop<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'Code surface'</span><span class="token punctuation">,</span> <span class="token string">'Surface calculée'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> axis<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span> inplace<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span><br>df<span class="token punctuation">.</span>drop_duplicates<span class="token punctuation">(</span>inplace<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></code></pre>
<p>O﻿n supprime les données de Code surface et Surface calculée dans le premier dataFrame puis en élimine tout les doublons de Bâtiment et de Nombre de poste de travail.</p>
<pre class="language-python"><code class="language-python">df2<span class="token operator">=</span> df2<span class="token punctuation">.</span>set_index<span class="token punctuation">(</span><span class="token string">'Bâtiment'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>df<span class="token punctuation">.</span>set_index<span class="token punctuation">(</span><span class="token string">'Bâtiment'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><br>df2<span class="token punctuation">.</span>rename<span class="token punctuation">(</span>columns<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">"Nombre de postes de travail"</span><span class="token punctuation">:</span><span class="token string">'pdt'</span><span class="token punctuation">}</span><span class="token punctuation">,</span> inplace<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span><br>df2<span class="token punctuation">.</span>drop<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'SHOB'</span><span class="token punctuation">,</span> <span class="token string">'SHON'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> axis<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span> inplace<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></code></pre>
<p>O﻿n joint les deux dataFrames en utilisant la colonne Bâtiment comme index de jointure, on renomme Nombre de poste de travail pour se simplifier la vie et on retire deux colonnes de surfaces qui ne sont pas utiles.</p>
<pre class="language-python"><code class="language-python">df2<span class="token operator">=</span> df2<span class="token punctuation">.</span>assign<span class="token punctuation">(</span>sun_sub<span class="token operator">=</span> <span class="token keyword">lambda</span> x<span class="token punctuation">:</span> x<span class="token punctuation">.</span>SUN <span class="token operator">/</span> x<span class="token punctuation">.</span>SUB<span class="token punctuation">)</span><br>df2<span class="token operator">=</span> df2<span class="token punctuation">.</span>assign<span class="token punctuation">(</span>sun_pdt<span class="token operator">=</span> <span class="token keyword">lambda</span> x<span class="token punctuation">:</span> x<span class="token punctuation">.</span>SUN <span class="token operator">/</span> x<span class="token punctuation">.</span>pdt <span class="token punctuation">)</span><br>df2<span class="token punctuation">.</span>rename<span class="token punctuation">(</span>columns<span class="token operator">=</span><span class="token punctuation">{</span><span class="token string">"sun_pdt"</span><span class="token punctuation">:</span><span class="token string">'SUN/pdt'</span><span class="token punctuation">,</span> <span class="token string">"sun_sub"</span><span class="token punctuation">:</span><span class="token string">'SUN/SUB'</span><span class="token punctuation">}</span><span class="token punctuation">,</span> inplace<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></code></pre>
<p>O﻿n crée deux nouvelles colonnes dans notre dataFrame que l'on peuple avec les ratios calculés d'après les valeurs des colonnes SUN, SUB et pdt, suivi d'un renommage des libellés de colonnes.</p>
<pre class="language-python"><code class="language-python">df2<span class="token operator">=</span> df2<span class="token punctuation">.</span>reset_index<span class="token punctuation">(</span><span class="token punctuation">)</span><br>df2<span class="token operator">=</span> df2<span class="token punctuation">.</span>assign<span class="token punctuation">(</span>bat_de_bureau<span class="token operator">=</span><span class="token string">''</span><span class="token punctuation">)</span><br><span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>df2<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span><br>    <span class="token keyword">if</span> df2<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token string">'SUN/SUB'</span><span class="token punctuation">]</span> <span class="token operator">>=</span> <span class="token number">.5</span><span class="token punctuation">:</span><br>        df2<span class="token punctuation">.</span>loc<span class="token punctuation">[</span>i<span class="token punctuation">,</span><span class="token string">'bat_de_bureau'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'oui'</span></code></pre>
<p>O﻿n crée une nouvelle colonne bat_de_bureau peuplé de vide dans le dataFrame, puis on parcourt celui-ci avec une boucle en testant si le ratio SUN/SUB est supérieur ou égal à 0.5. Lorsque c'est le cas, on inscrit oui dans la colonne bat_de_bureau.</p>
<pre class="language-python"><code class="language-python">df2<span class="token punctuation">.</span>to_excel<span class="token punctuation">(</span><span class="token string">'ratio_par_bat.xlsx'</span><span class="token punctuation">,</span> index <span class="token operator">=</span> <span class="token boolean">None</span><span class="token punctuation">,</span> header<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span></code></pre>
<p>P﻿our finir, on exporte au format Excel le dataFrame, pour import dans la GTP.</p>
<h3>L﻿e tableau en sortie</h3>
<p>L﻿e fichier de sortie est structuré sans doublon, avec une donnée par colonne sur les 259 lignes et peut-être importer en l'état dans la GTP !</p>
<table>
<thead>
<tr>
<th style="text-align:left">Bâtiment</th>
<th style="text-align:center">SDP</th>
<th style="text-align:center">SUB</th>
<th style="text-align:center">SUN</th>
<th style="text-align:center">pdt</th>
<th style="text-align:center">SUN/SUB</th>
<th style="text-align:center">SUN/pdt</th>
<th>bat_de_bureau</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">Bâtiment A</td>
<td style="text-align:center">8725,78</td>
<td style="text-align:center">8229,78</td>
<td style="text-align:center">1731,87</td>
<td style="text-align:center">74</td>
<td style="text-align:center">0,210439404</td>
<td style="text-align:center">23,40364865</td>
<td></td>
</tr>
<tr>
<td style="text-align:left">Bâtiment B</td>
<td style="text-align:center">5794,95</td>
<td style="text-align:center">5373,75</td>
<td style="text-align:center">690,71</td>
<td style="text-align:center">47</td>
<td style="text-align:center">0,128534078</td>
<td style="text-align:center">14,69595745</td>
<td></td>
</tr>
<tr>
<td style="text-align:left">Bâtiment C</td>
<td style="text-align:center">2055,09</td>
<td style="text-align:center">1881,79</td>
<td style="text-align:center">1365,47</td>
<td style="text-align:center">71</td>
<td style="text-align:center">0,725622944</td>
<td style="text-align:center">19,23197183</td>
<td>oui</td>
</tr>
<tr>
<td style="text-align:left">Bâtiment D</td>
<td style="text-align:center">5170,24</td>
<td style="text-align:center">4661,86</td>
<td style="text-align:center">930,09</td>
<td style="text-align:center">169</td>
<td style="text-align:center">0,199510496</td>
<td style="text-align:center">5,503491124</td>
<td></td>
</tr>
</tbody>
</table>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Followgraph, un outil pour découvrir des comptes à suivre sur Mastodon</title>
    <link href="https://www.nicolas-birckel.fr/posts/followgraph-un-outil-pour-découvrir-des-comptes-à-suivre-sur-mastodon/"/>
    <pubDate>2023-04-04T06:41:33Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/followgraph-un-outil-pour-découvrir-des-comptes-à-suivre-sur-mastodon/</id>
    <content type="html"><![CDATA[
      <p>C﻿omme beaucoup j'ai délaissé Twitter au profit de Mastodon après le rachat par Musk de l'oiseau bleu.</p>
<p>P﻿as de pub ni d'algorithme de suggestions de contenus ou de personnes à suivre rendent Mastodon plaisant à utiliser car bien plus &quot;calme&quot;. Les discussions et échanges dessus me paraissent également moins violents et plus constructifs.</p>
<p>Toutefois, M﻿astodon atteint maintenant les 10 millions de comptes d'après <a href="https://mastodon.social/@mastodonusercount/110139015839832683">@mastodonusercount</a>et (re)trouver des personnes à suivre sur Mastodon est plutôt compliqué. Quelques outils sont sortis lors des différentes vagues de migration Twitter -&gt; Mastodon mais ceux-ci commencent à être suspendus par Twitter, c'est le cas de <a href="https://debirdify.pruvisto.org/">Debirdfy</a> par exemple.</p>
<p><a href="https://followgraph.vercel.app/">Followgraph</a> vous propose d'explorer les follows de vos follows pour découvrir de nouveaux comptes à suivre.</p>
<p><img src="/images/followgraph-header.png" alt="Capture d'ecran de la page d'accueil de Follograph, dont l'accroche est &quot;Find awesome people on Mastodon&quot;"></p>
<p>O﻿n rentre son compte mastodon, ça mouline plus ou moins longtemps en fonction de votre nombre de follows puis le site retourne une liste de comptes, par défaut triée par le nombre de vos follows suivant ce compte.</p>
<p>Cette liste est &quot;filtrable&quot; en effectuant une recherche dans les bio des comptes proposés, ce qui est bien pratique pour trouver de nouveaux comptes à suivre sur un domaine précis.</p>
<p><img src="/images/followgraph-search_results.png" alt="Résultat d'une utilisation de Follograph, avec une liste de comptes à suivre filtrée sur le mot &quot;Design&quot;"></p>
<p>U﻿n outil à tester si vous êtes à la recherche de nouveaux comptes à suivre sur Mastodon !</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Février en quelques mots</title>
    <link href="https://www.nicolas-birckel.fr/posts/février-en-quelques-mots/"/>
    <pubDate>2023-03-02T10:10:39Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/février-en-quelques-mots/</id>
    <content type="html"><![CDATA[
      <p>Février est passé à la vitesse de l'éclair et il fut plus calme que prévu</p>
<h2>Côté pro</h2>
<p>L﻿a restructuration des services suit son cours. On est toujours dans le flou et on navigue à vue, mais les projets de fond avancent tout de même.</p>
<p>L﻿a mise en place du BIM au sein de l'université est un sacré challenge, et les travaux en cours avec notre AMO préfigurent pas mal de boulot à venir dans les définitions et la gestion de procédures de collecte d'informations et de traitement de données. De beaux projets à mener si on obtient le temps et les ressources  pour ;)</p>
<p>J﻿'ai eu des contacts plutôt intéressants pour des opportunités professionnelles, mais rien de bien concret finalement.</p>
<h2>C﻿ôté perso</h2>
<p>U﻿n mois très court, coupé part des vacances scolaires. Cela a été l'occasion de bien profiter du temps passé avec mes enfants. Escalade, piscine et randonnées ont rythmé les week-ends et la semaine de congés avec les enfants.</p>
<p>N﻿ous avons aussi accueilli le neveu de ma compagne pour quelques jours et du haut de ses presque 6 ans, il n'a pas peur d'enchainer les kilomètres en randonnée !</p>
<p>P﻿as de travaux dans l'appartement ce mois-ci. On attend le retour des températures plus clémentes pour finir (enfin) la clôture de la terrasse.</p>
<h2>C﻿ôté Photo</h2>
<p>J﻿'ai pu tester mon TTArtisan 25mmf2 lors de deux shootings en intérieur, en lumière naturelle et également en lumière continue artificielle, et c'est un grand oui !</p>
<p>J'avais peur de la qualité des bagues et de la précision de celle de mise au point (c'est un objectif tout manuel) mais la qualité est au rendez-vous. L'objectif vignette un peu à pleine ouverture mais ce n'est guère dérangeant.</p>
<p>J﻿'ai commencé à publier les photos prises avec cet objectif sur <a href="https://pixelfed.social/nbirckel">pixelfed</a> (nsfw)</p>
<h2>C﻿ôté lecture</h2>
<p>Peu de lecture ce mois-ci :</p>
<ul>
<li>J﻿e continue <em>Influence et manipulation</em> de Robert Cialdin,</li>
<li>J﻿'ai laissé de coté <em>Des fleurs pour Algernon</em> de Daniel Keyes (mais il faut que je le reprenne),</li>
<li>j﻿'ai lu les 25 tomes de <em>Soul Eaters</em> de Atsushi Ōkubo d'une traite.</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Janvier en vrac</title>
    <link href="https://www.nicolas-birckel.fr/posts/janvier-en-vrac/"/>
    <pubDate>2023-01-30T13:32:49Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/janvier-en-vrac/</id>
    <content type="html"><![CDATA[
      <p>Le mois de janvier se termine, c'est l'occasion d'écrire quelques lignes en vrac sur le pro, le perso et les hobbies.</p>
<h2>Côté pro</h2>
<p>E﻿ntre un changement de direction et une réorganisation, ce mois de janvier pose un flou sur l'avenir du service dans lequel je travaille. Mais nous ne manquons clairement pas de boulot entre la mise en place du Building Information Management au sein de l'université, la fiabilisation de nos jeux de données et l'exploitation de ceux-ci pour répondre à nos différentes obligations (oui je parle de toi OPERAT) ou audits à venir.</p>
<p>O﻿n va bien voir ce que la réorganisation apportera comme surprises.</p>
<p>J﻿'ai aussi relancé le projet Validation des Acquis d'Expérience ce mois-ci, avec pour objectif de la valider au plus tard l'année prochaine.</p>
<h2>C﻿ôté perso</h2>
<p>U﻿n début d'année sous le signe des travaux manuels : nous nous sommes attaqués au remplacement d'une porte coulissante de l'appartement. L'ancienne en verre était fissurée et désaxée suite à un choc. On a rapidement décidée de la changer lorsqu'on s'est rendu-compte qu'elle commençait à trop tirer sur le rail et à abimer le plâtre.</p>
<p>L﻿a dépose fut plutôt facile et maintenant que les réparations du mur sont faites, je vais pouvoir m'atteler à l'installation du nouveau rail puis à la pose de la porte une fois celle-ci lasurée.</p>
<p>N﻿ous avons également restauré une bonnetière, que ma compagne a récupéré chez un de ces oncles.</p>
<p>Après plusieurs jours de ponçage, un démontage des moulures pour remplacer une vitre par du grillage, de la peinture et la découpe sur mesure de nouvelles étagères en bois, ce meuble vient de prendre place ce week-end dans la chambre des enfants.</p>
<p><img src="/images/img_7731.jpg" alt="Une bonnetière  dans une chambre" title="La bonnetière terminée et en place"></p>
<p>M﻿a mère a obtenu sa nationalité Luxembourgeoise. Je vais donc entamer les démarches pour l'obtenir aussi. Cela sera peut-être un jour utile, qui sait ?</p>
<p>J﻿'aurais bien parlé jeu-vidéo aussi, mais depuis Elden Ring tout ce que j'ai pu lancé dernièrement me semble fade. Je ne joue donc pas beaucoup en ce moment</p>
<h2>C﻿ôté Photo</h2>
<p>J﻿'ai reçu mes scans d'une pellicule Kodak Ultra Max 400 que j'avais envoyé chez <a href="https://morifilmlab.com/">MoriFilm Lab</a> en Belgique. Je suis plutôt content du résultat pour ma toute première expérience argentique.</p>
<p><img src="/images/lucie_kodakultramax400.jpg" alt="" title="Lucile, au parc."></p>
<p><img src="/images/louise_kodakultramax400.jpg" alt="" title="Louise, Balade en ville"></p>
<p>J﻿'ai également reçu mon objectif de chez TTArtisan au milieu du mois, dont je parlais dans <a href="https://www.nicolas-birckel.fr/posts/panne-boitier-fuji-et-solution-de-contournement/">https://www.nicolas-birckel.fr/posts/panne-boitier-fuji-et-solution-de-contournement/</a>. Je vais le tester lors de deux shooting prévus le week-end prochain.</p>
<h2>C﻿ôté lecture</h2>
<p>V﻿u que je ne joue pas beaucoup en ce moment, j'ai du temps pour lire :</p>
<ul>
<li>J﻿'ai terminé <em>L'empereur-dieu de Dune,</em></li>
<li>j﻿'ai lu <em>Les Agents</em>, de Grégoire Courtois,</li>
<li>j﻿'ai enfin commencé à lire <em>Influence et manipulation</em> de Robert Cialdin,</li>
<li>j﻿'ai quasiment fini de lire <em>Des fleurs pour Algernon</em> de Daniel Keyes.</li>
</ul>
<p>E﻿t vous votre mois de Janvier ?</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Panne boitier Fuji et solution de contournement</title>
    <link href="https://www.nicolas-birckel.fr/posts/panne-boitier-fuji-et-solution-de-contournement/"/>
    <pubDate>2023-01-09T12:33:28Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/panne-boitier-fuji-et-solution-de-contournement/</id>
    <content type="html"><![CDATA[
      <p>A﻿près m'avoir fait le coup en plein <a href="https://pixelfed.social/i/web/post/488979430065491944">shooting cet été</a>, mon fidèle XT-20 a décidé de me lâcher encore une fois ce week-end. En cause, un soucis d'oxydation des connecteurs entre le boitier et l'objectif.</p>
<p>J﻿'ai pu tester mes objectifs sur le boitier d'un confrère photographe et également en boutique, ceux-ci ne sont pas en cause. Mais un objectif sorti de la vitrine du magasin reproduit directement le plantage de mon boitier. C﻿elui-ci clignotte plusieurs fois puis reste bloqué à f0 et l'objectif est inopérant pour la mise au point et l'ouverture, même en passant le boitier en manuel.</p>
<p>M﻿on petit Fuji a bien vécu depuis son achat en 2017 et je l'ai plutôt malmené en shootant régulièrement dans des conditions assez extrême pour un boitier qui n'est pas tropicalisé : sous la pluie, dans le sable, dans le froid, etc. Je m'étonne presque de ne pas avoir eu de soucis avant.</p>
<p>Il n'est bien sur plus garantie depuis le temps et j'ai bien peur qu'un retour en SAV me coute bien cher. Les soucis d'électronique coute toujours cher. Cela pourrait être l'occasion de monter en gamme et d'acquérir un XT-4 d'occasion voir, soyons fous, un XT-5 pour pouvoir continuer d'utiliser mon Fuji 35mmf1.8 que j'apprécie tant, mais il n'en sera rien pour l'instant.</p>
<p>J﻿'ai décidé de contourner le problème et de réfréner le Gear Acquisition Syndrome.</p>
<p>M﻿on XT-20 fonctionnant encore parfaitement avec des objectifs sans électronique, je vais donc le conserver et remplacer mon 35mm fuji par un objectif manuel. Je vais d'ailleurs descendre un peu en focale pour plus de polyvalence et partir sur le 25mmf2 de chez TTArtisan , pour un investissement 10 à 15 fois moindre qu'un changement de boitier.</p>
<p>Une fois reçu et testé en shooting, je ferai un retour sur cette optique &quot;cheap&quot; mais qui va bien me dépanner !</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>2022 en quelques lignes</title>
    <link href="https://www.nicolas-birckel.fr/posts/2022-en-quelques-lignes/"/>
    <pubDate>2023-01-03T10:42:35Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/2022-en-quelques-lignes/</id>
    <content type="html"><![CDATA[
      <p>J﻿'ai vu passer l'idée sur les blogs d'<a href="https://www.eiffair.fr">Eiffair</a> et de <a href="https://tbdd.be/">Thibaudd</a> : lister les trucs cools de l'année écoulée, en 50 ou 100 lignes.
J﻿e trouve cela plutôt intéressant et positif, j'ai donc décidé de me prêter à l'exercice sans me fixer de nombre de lignes à atteindre pour la première fois.</p>
<ol>
<li>M﻿on CDD à l'Université de Lorraine a été renouvelé pour 2023.</li>
<li>J﻿'ai remis en place ce blog en 2022, même si je n'ai pas publié grand chose dessus.</li>
<li>J﻿'ai lu les 3 premiers tomes de Dune, et j'ai démarré <em>L'empereur-dieu de Dune</em> hier.</li>
<li>J﻿'ai aussi lu quelques non-fiction : <em>Atomic Habits</em>, <em>Feck Perfuction</em>, et <em>The Photography Storytelling Workshop.</em></li>
<li>E﻿n parlant photographie, j'ai réussi à caler quelques shooting dans l'année 2022 mais pas autant que j'aurais voulu.</li>
<li>O﻿n a acheté un appartement avec ma compagne.</li>
<li>D﻿u coup on a déménagé d'un pâté de maison, pour 30m2 de plus et une terrasse.</li>
<li>O﻿n a décaissé 2m3 de gravats pour les remplacer par de la terre.</li>
<li>L﻿'herbe a poussée depuis, donc c'est qu'on a plutôt bien fait ça ;)</li>
<li>O﻿n a du revendre plein de trucs, fusionner le mobilier issu de deux séparations c'est sport.</li>
<li>J﻿'ai sauvé mon boitier photo qui a eu un souci de contacteurs (en plein shooting sinon c'est pas drôle)</li>
<li>J﻿'ai appris à me servir d'un marteau piqueur et à poser du grillage rigide.</li>
<li>M﻿es enfants apprécient de plus en plus la randonnée.</li>
<li>J﻿e n'ai plus d'ordinateur fixe à la maison et je le vis bien.</li>
<li>Ce qui fait que j'exploite bien plus mon iPad Pro et être iPad only me plait plutôt bien.</li>
<li>J﻿e suis toujours en train d'effectuer la transition vers le fediverse.</li>
<li><a href="https://pixelfed.social/i/web/profile/422339972513731843">P﻿ixelfed</a> remplace petit à petit <a href="https://www.instagram.com/nbirckel/">Instagram</a>.</li>
<li>M﻿ais je garde IG car c'est là que je trouve mes modèles photo.</li>
<li>S﻿uite au rachat de Twitter par Musk, j'ai réactivé mon compte <a href="https://mastodon.social/@nbirckel">Mastodon</a>, et je suis content d'y retrouver une partie de la communauté que j'avais sur l'oiseau bleu.</li>
<li>J﻿'ai fêté mes 40 ans entouré des gens que j'apprécie.</li>
<li>J﻿e me suis essayé à la photographie argentique, il faut que je fasse développer ma première pellicule en ce début d'année.</li>
<li>J﻿'ai acheté et fini Elden Ring, quel aventure ! le Game of The Year est bien mérité.</li>
<li>M﻿on essai de vélotaf est plutôt concluant, du moins pour ma semaine sans les enfants. Des vêtements de pluie sont par contre nécessaires 😅</li>
<li>O﻿n a passé deux superbes semaines de vacances en Vendée cet été en famille.</li>
<li>O﻿n a visité le château de Blois en remontant car on avait pas eu le temps de le faire l'été dernier.</li>
<li>L﻿'océan m'a volé mes lunettes de soleil.</li>
<li>M﻿on meilleur ami est devenu père, je suis extrêmement content pour lui.</li>
<li>J﻿'ai beaucoup plus vu ma meilleure amie cette année, j'en suis très heureux.</li>
<li>O﻿n a été voir le spectacle de Sellig et on a pu discuter avec lui après.</li>
<li>J﻿'ai drastiquement réduit ma consommation de viande.</li>
<li>M﻿on poids s'est stabilisé a 75kg, j'ai enfin atteint mon objectif !</li>
<li>O﻿delaf en concert c'était vraiment cool.</li>
<li>O﻿n a fait deux concerts punk-rock dans une brasserie du coin, la bière était bien bonne et l'ambiance fantastique.</li>
<li>J﻿'ai résisté à l'envie d'acheter un troisième clavier mécanique.</li>
<li>H﻿ormis Elden Ring, je n'ai pas acheté d'autres jeux en 2022.</li>
<li>O﻿n est parti faire un mid-week à Rome en couple en novembre .❤</li>
<li>E﻿n quatre jours à Rome, nous avons marché 75km.</li>
<li>L﻿a Basilique Saint-Pierre est le plus beau monument que j'ai vu de toute ma vie.</li>
<li>P﻿our moi, l﻿a cuisine italienne surpasse de loin la gastronomie française.</li>
<li>L﻿a relation entre ma compagne et mes enfants se passe de mieux en mieux.</li>
<li>J﻿'ai procrastiné mon dossier de VAE. C'est mal, je m'y colle en 2023.</li>
<li>J﻿'ai fait bien plus de photos que j'ai eu de temps disponible pour les traiter. Désolé pour les modèles qui attendent encore des photos de 2022.</li>
<li>O﻿n a construit 4 bacs pour la terrasse, j'ai hâte d'y planter des légumes.</li>
<li>O﻿n a maintenant un citronnier et un olivier sur la terrasse.</li>
<li>J﻿'ai commencé une campagne de Donjons et Dragons avec les enfants.</li>
<li>D﻿epuis le déménagement, on a fait croire aux enfants que nous n'avions pas internet à l'appart. Leur detox aux écrans est bien engagée 😂</li>
<li>P﻿our compenser, je leurs ai acheté plein de livres et de jeux de société.</li>
<li>E﻿t ils s'en servent !</li>
<li>J﻿'ai installé Nextcloud sur mon Raspi et j'ai supprimé mon abonnement Dropbox.</li>
<li>J﻿eff Bezos est suffisamment riche, j'ai résilié Amazon Prime.</li>
<li>D﻿isney Plus aussi a été résilié, on ne s'en servait pas.</li>
<li>J﻿'ai chopé le Covid au mariage d'une amie, mais ce fut vraiment léger comme crève.</li>
<li>J﻿'ai été malade comme un chien la semaine avant Noël, mais ce ne fut ni le Covid ni la grippe, malgré les symptômes.</li>
<li>O﻿n a vu le dernier spectacle de Pierre-Emmanuel Barré. C'était bien trash mais très drôle.</li>
<li>O﻿n a passé de superbes fêtes de fin d'année en famille. Ça ressource bien.</li>
<li>o﻿n a parcouru 120km de sentiers de randonnée cette année. C'est peu et j'espère qu'on fera au moins le double en 2023.</li>
</ol>
<p>A vos claviers pour faire votre liste si l'exercice vous semble pertinent !</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Un test de publication automatique du site vers les réseaux sociaux</title>
    <link href="https://www.nicolas-birckel.fr/posts/un-test-de-publication-automatique-du-site-vers-les-réseaux-sociaux/"/>
    <pubDate>2022-11-24T13:06:38Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/un-test-de-publication-automatique-du-site-vers-les-réseaux-sociaux/</id>
    <content type="html"><![CDATA[
      <p>D﻿ans l'idée d'aller plus vers le POSSE, je cherche à automatiser le partage de mes articles vers les réseaux sociaux, pour pas avoir à le faire à la main.</p>
<p>J﻿'ai vu qu'il était possible de s'appuyer sur l'API de Mastodon pour publier des statuts, et donc de faire une automatisation IFTTT RSS vers Webhook.</p>
<p>C﻿es quelques lignes sont donc un test.</p>
<p>O﻿n va bien voir si cela fonctionne !</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Les Webmentions sont là !</title>
    <link href="https://www.nicolas-birckel.fr/posts/les-webmentions-sont-là/"/>
    <pubDate>2022-11-23T09:32:03Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/les-webmentions-sont-là/</id>
    <content type="html"><![CDATA[
      <p>A﻿près quelques péripéties pour trouver comment modifier mon site <a href="https://www.11ty.dev/">Eleventy</a> dans un environnement de dev potable sur Ipad, je suis content d'avoir enfin réussi à intégrer les webmentions sur celui-ci !</p>
<h3>W﻿ebmention ? Kezako ?</h3>
<p><a href="https://fr.wikipedia.org/wiki/Webmention">D﻿'après Wikipedia</a>,</p>
<blockquote>
<p><strong>Webmention</strong> est une recommandation du <a href="https://fr.wikipedia.org/wiki/W3C" title="W3C">W3C</a> (organisme international chargé de la normalisation du web) décrivant un protocole simple de notification d'une URL lorsqu'elle est mentionnée par un site externe, et permettant à une page web de demander une notification lorsque quelqu'un ajoute un lien vers celle-ci. Webmention est à l'origine développé par la communauté de l'IndieWebCamp et publié comme un brouillon de travail du W3C le 12 janvier 2016. Il devient une recommandation du W3C le 12 janvier 2017. Webmention permet aux auteurs de vérifier et conserver qui génère un lien, une référence ou un commentaire vers leurs articles. En incorporant ce type de commentaires depuis un autre site, ils fournissent la fonction de commentaire fédéré.</p>
</blockquote>
<p>D﻿ans mon cas, cela me permet d'afficher en pied d'article, les différents reposts, like et réponses faits en lien avec l'article.</p>
<h3>L﻿a mise en place de Webmention sous Eleventy</h3>
<p>J﻿e ne vais pas vous mentir, n'étant pas développeur j'en ai bavé 😅</p>
<p>J'avais déjà essayé lorsque je suis passé de Jekyll à Eleventy, mais ce fut un échec cuisant.</p>
<p>J'ai donc fouillé internet et je suis tombé sur ce How-to très bien documenté : <a href="https://sia.codes/posts/webmentions-eleventy-in-depth/">https://sia.codes/posts/webmentions-eleventy-in-depth/</a>. Et même en le suivant, il a fallut adapter à mon propre code ce qui ne fut pas totalement une partie de plaisir, surtout sans ordinateur à disposition.</p>
<p>U﻿n grand merci à Sia pour cette ressource ainsi qu'à tout ceux d'entre vous qui documentent et partagent ce type de contenu !</p>
<h3>Attends, tu as parlé d'environnement de dev potable sur iPad ?!</h3>
<p>N'ayant plus d'ordinateur personnel, j'ai effectivement fait toute l'édition du code depuis mon iPad, oui même les <em>npm install</em>  et les commits vers github.</p>
<p>J﻿e reviendrais sur l'app utilisée pour cela et sur ma &quot;stack&quot; logiciel sur iPad dans un prochain article.</p>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Comment j&#39;utilise un clavier 50% comme clavier principal</title>
    <link href="https://www.nicolas-birckel.fr/posts/comment-jutilise-un-clavier-50-comme-clavier-principal/"/>
    <pubDate>2022-09-27T10:15:59Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/comment-jutilise-un-clavier-50-comme-clavier-principal/</id>
    <content type="html"><![CDATA[
      <p>J﻿'utilise un clavier &quot;Preonic&quot; (ou 50% ortholinéaire) pour travailler sur ordinateur depuis maintenant 1 an. Le terme &quot;ortholinéaire&quot; signifie que toute les touches sont alignées sur une grille. Le pourcentage fait référence au nombre de touches sur le clavier par rapport à un clavier classique, avec une rangée de chiffres, une rangée de touches de fonction, les touches inser/home/etc, les flèches et un pavé numérique.</p>
<p><img src="/images/olkb_preonic.jpg" alt="une photo de mon clavier Preonic" title="mon clavier Preonic"></p>
<p>P﻿lutôt joli, non ?</p>
<p>L﻿es rangées décalées des claviers ne sont qu'un vieux reliquat des bras physiques de la machine à écrire, qui n'a plus lieux d'être à l'heure du tout informatique. Le confort de ne plus avoir à tendre les doigts pour atteindre certaines touches est un vrai plaisir une fois habitué à la disposition ortholinéaire.</p>
<h2>E﻿t les symboles dans tout ça ?</h2>
<p>I﻿l y a deux touches à gauche et à droite de la barre d'espace. Elles sont appelées respectivement &quot;lower&quot;et &quot;raise&quot; et permettent, lorsque pressées, de basculer entre différentes couches. Par exemple, pour taper un <code>-</code> (tiret) mon clavier utilise &quot;raise&quot;+ j.</p>
<p>j﻿'ai trois couches principales sur mon clavier. Dans les captures ci-dessous, &quot;lower&quot;et &quot;raise&quot; sont remplacés par &quot;MO(n)&quot;, qui signifie &quot;momentary on&quot; et &quot;n&quot; faisant référence à la couche à activer lorsque j'appuie sur la touche.</p>
<h3>Couche principale (layer 0)</h3>
<p><img src="/images/layer0.png" alt="La configuration du Layer0" title="Layer 0"></p>
<h3>C﻿ouche &quot;lower&quot; (layer1)</h3>
<p><img src="/images/layer1.png" alt="La configuration du Layer1" title="Layer 1"></p>
<h3>C﻿ouche &quot;raise&quot; (layer2)</h3>
<p><img src="/images/layer2.png" alt="La configuration du layer2" title="Layer 2"></p>
<p>U﻿n des gros avantage des couches sur mon clavier est que tout les symboles sont très proches de la ligne de touches de repos, ce qui signifie que je peux les taper sans trop bouger les mains, voire pas du tout. Cela change pas mal des claviers décalés où j'avais pris de mauvaises habitudes : je déplaçais la main ou utilisais le majeur pour aller appuyer sur = par exemple.</p>
<p>L﻿'encodeur rotatif visible sur la photo de mon clavier est bien reconnu comme une touche dans les différentes couches du clavier. Ce que vous ne voyez pas dans les captures ci dessous c'est ce qu'il fait à la rotation : scrollup et down en couche principale et gestion du volume en couche &quot;raise&quot;.</p>
<h2>C'est bien beau tout ça, mais ton clavier est en QWERTY !</h2>
<p>C﻿'est un choix personnel. Ce clavier &quot;Preonic&quot; fonctionne grâce à un firmware entièrement personnalisable : <a href="https://qmk.fm/">https://qmk.fm/</a> . Je pourrais très bien le configurer en Dvorak, en Bépo ou en Azerty si je le souhaitais.</p>
<p>J﻿e suis resté en Qwerty pour plusieurs raisons :</p>
<ul>
<li>L'écrasante majorité des sets de keycaps sont prévus pour Qwerty et, hormis sur certains profils de sculpture de touche, il n'est pas possible d'échanger une touche d'un ligne à l'autre car elles n'ont pas la même forme.</li>
<li>U﻿ne fois l'ordinateur configuré en Clavier États-Unis International, taper des majuscules accentuées est d'une telle simplicité. Faire des Ç, des À et autres É en seulement deux touches change la vie.</li>
<li>Une part de flemme, bien qu'il existe des configurateurs visuels pour QMK.</li>
</ul>
<p>J﻿'ai également la possibilité de rajouter d'autre couches  (jusqu'à 8 sur ce modèle) pour par exemple faire une couche dédié au gaming ou une couche de raccourcis et de macros spécifiques à un logiciel.</p>
<h2>L﻿e matériel :</h2>
<ul>
<li>S﻿witches Aliaz Silent Tactile 60g</li>
<li>Drop + OLKB Preonic Keyboard MX Kit V3</li>
<li>Acute Keycap Set</li>
</ul>

    ]]></content>
  </entry>
	
  
  <entry>
    <title>Attention peinture fraîche</title>
    <link href="https://www.nicolas-birckel.fr/posts/attention-peinture-fraîche/"/>
    <pubDate>2022-05-17T09:54:43Z</pubDate>
    <id>https://www.nicolas-birckel.fr/posts/attention-peinture-fraîche/</id>
    <content type="html"><![CDATA[
      <p>J'ai décidé dernièrement de faire un coup de ménage dans ma présence en ligne et de revenir à une approche de celle-ci orientée <a href="https://indieweb.org/POSSE">POSSE</a>.</p>
<h2>Changement de stack technique</h2>
<p>Mon ancien site, à l'abandon depuis 2018, tournait sous jekyllrb avec un build manuel sur mon macbook puis un transfert, manuel également, sur mon hébergement.</p>
<p>Je n'ai plus aussi souvent le mac avec moi, j'ai donc cherché une solution me permettant de publier et de gérer mon site depuis l'appareil qui m'accompagne tout le temps : mon iPad Pro.</p>
<p>Après quelques échanges sur Twitter et Mastodon puis quelques tests préalables, mon choix s'est finalement porté sur <a href="https://www.11ty.dev/">Eleventy</a>, en utilisant <a href="https://hylia.website/">Hylia </a>comme starter, le tout déployé sur <a href="https://www.netlify.com/">Netlify</a>.</p>
<h2>Travaux de ravalement à venir</h2>
<p>Je suis en train de prendre en main le theming propre à Eleventy, ce site va s'améliorer petit à petit, tant au niveau du contenu que du design.</p>
<p>Stay tuned !</p>
<h2>Au fait</h2>
<p>Il n'y a pas que le site qui déménage, ce ménage dans ma présence en ligne passe également par mes réseaux sociaux. J'en abandonne certains au profit du fédiverse :</p>
<ul>
<li>Au revoir Twitter, bonjour Mastodon : <a href="https://mastodon.social/web/@nbirckel">@nbirckel@mastodon.social</a></li>
<li>Ciao  Instagram, mes photos seront publiées sur Pixelfed :  <a href="https://pixelfed.social/i/web/profile/422339972513731843">@nbirckel@pixelfed.social</a></li>
</ul>

    ]]></content>
  </entry>
	
</feed>
