<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python on Blog GoHugo de Fredô : Linux, Proxmox, IA, Trail, Course, Randonnée, Gravel, Ski de Randonnée</title>
    <link>https://move.cyber-neurones.org/tags/python/</link>
    <description>Recent content in Python on Blog GoHugo de Fredô : Linux, Proxmox, IA, Trail, Course, Randonnée, Gravel, Ski de Randonnée</description>
    <generator>Hugo</generator>
    <language>fr</language>
    <lastBuildDate>Mon, 02 Jun 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://move.cyber-neurones.org/tags/python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Ubuntu 24 : Stable diffusion : Problème avec Python 3.12 &amp; torch</title>
      <link>https://move.cyber-neurones.org/post/2025/06/2025-06-02-ubuntu-24-stable-diffusion-probleme-avec-python-3-12-torch/</link>
      <pubDate>Mon, 02 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2025/06/2025-06-02-ubuntu-24-stable-diffusion-probleme-avec-python-3-12-torch/</guid>
      <description>&lt;p&gt;Avec Python 3.12.3 :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Python 3.12.3 (main, Feb  4 2025, 14:48:35) [GCC 13.3.0]&#xA;Version: v1.10.1&#xA;Commit hash: 82a973c04367123ae98bd9abdf80d9eda9b910e2&#xA;Installing torch and torchvision&#xA;Looking in indexes: https://pypi.org/simple, https://download.pytorch.org/whl/cu121&#xA;ERROR: Could not find a version that satisfies the requirement torch==2.1.2 &#xA;(from versions: 2.2.0, 2.2.0+cu121, 2.2.1, 2.2.1+cu121, 2.2.2, 2.2.2+cu121, &#xA;2.3.0, 2.3.0+cu121, 2.3.1, 2.3.1+cu121, 2.4.0, 2.4.0+cu121, 2.4.1, &#xA;2.4.1+cu121, 2.5.0, 2.5.0+cu121, 2.5.1, 2.5.1+cu121, 2.6.0, 2.7.0)&#xA;ERROR: No matching distribution found for torch==2.1.2&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Donc j&amp;rsquo;utilise Python 3.11 :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# apt-get install python3-setuptools&#xA;# apt-get install python3-build&#xA;# python3.11 -m pip install --upgrade pip setuptools wheel&#xA;# virtualenv -p /usr/bin/python3.11 venv&#xA;created virtual environment CPython3.11.12.final.0-64 in 1366ms&#xA;  creator CPython3Posix(dest=/home/XXXX/stable-diffusion-webui/venv, clear=False, &#xA;no_vcs_ignore=False, global=False)&#xA;  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, &#xA;via=copy, app_data_dir=/home/XXXX/.local/share/virtualenv)&#xA;    added seed packages: pip==24.0, setuptools==68.1.2, wheel==0.42.0&#xA;  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator&#xA;$ source venv/bin/activate&#xA;$ python3.11 -m pip install --upgrade pip setuptools wheel&#xA;$ bash webui.sh --api --listen&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Python : test de la librairie calplot</title>
      <link>https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/</link>
      <pubDate>Mon, 09 Dec 2024 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/</guid>
      <description>&lt;p&gt;Le plus longs c&amp;rsquo;est de fixer les problèmes Python &amp;hellip;&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;findfont: Font family &amp;#39;Helvetica&amp;#39; not found.&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ensuite quelques lignes de code :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import pandas as pd&#xA;import calplot&#xA;import pylab&#xA;from matplotlib import rcParams&#xA;&#xA;df_tem = pd.read_csv(&amp;#39;./VeloResume2020-2024-v4.csv&amp;#39;, delimiter=&amp;#34;;&amp;#34;)&#xA;df_tem2 = df_tem.groupby([df_tem[&amp;#39;date&amp;#39;].dt.date,&amp;#39;activity&amp;#39;])[&amp;#39;km&amp;#39;].sum().reset_index().rename(columns={&amp;#39;sum&amp;#39;:&amp;#39;km&amp;#39;})&#xA;df_tem2 = df_tem2.query(&amp;#39;activity==&amp;#34;E-Biking&amp;#34;&amp;#39;&#xA;fig = calplot.calplot(df_tem2[&amp;#39;km&amp;#39;],&#xA;                cmap=&amp;#34;BuGn&amp;#34;,&#xA;                fillcolor=&amp;#34;w&amp;#34;,&#xA;                linecolor=&amp;#34;w&amp;#34;,&#xA;                suptitle_kws=csfont,&#xA;                yearlabel_kws={&amp;#39;fontname&amp;#39;:&amp;#39;sans-serif&amp;#39;},&#xA;                fig_kws=dict(facecolor=&amp;#34;w&amp;#34;),&#xA;                subplot_kws=dict(facecolor=&amp;#34;w&amp;#34;),&#xA;                edgecolor=&amp;#34;grey&amp;#34;)&#xA;pylab.savefig(&amp;#39;E-Biking.png&amp;#39;)&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#x9;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;style&gt;&#xA;&#x9;&#xA;&#xA;&#x9;&#xA;&lt;/style&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;div id=&#34;gallery-89f12a4ee3348036c51a639832740c2e-0-wrapper&#34; class=&#34;gallery-wrapper&#34;&gt;&#xA;&lt;div id=&#34;gallery-89f12a4ee3348036c51a639832740c2e-0&#34; class=&#34;justified-gallery&#34;&gt;&#xA;&#x9;&#xA;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&lt;div&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/images/mountain-biking.png&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;class=&#34;galleryImg&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;img&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;width=&#34;600&#34; height=&#34;408&#34;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;style=&#34;filter: blur(25px);&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;src=&#34;data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABYAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/APXzJiRUPVuhwf507DY6Ck2/7AP4/wCf8mkII/5Z5&amp;#43;h&amp;#43;v&amp;#43;fxoAUq5bOQB6AVDbKw1G4bJwY0GM8Ahn/xqUgnogz160QkedIO4A/Dk8UmNOwZXOMU04KPtJBPQkZxQfvn6/40i/dP&amp;#43;e9MQ4Fccjr0/wA/jTLdWF9MxI2GJCo/F/8A61KPuj6/1FOh/wCPl/8Arkn82pgf/9k=&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;class=&#34;lazy&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;data-src=&#34;https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/images/mountain-biking_hu_8dfa7a6416de47e.png&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&#x9;&#xA;&#x9;&#xA;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&lt;div&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/images/gravel-biking.png&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;class=&#34;galleryImg&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;img&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;width=&#34;600&#34; height=&#34;408&#34;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;style=&#34;filter: blur(25px);&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;src=&#34;data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABYAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/APYcN7UYbHQUxmUHB25xk5bFKpV1yFBBHrQA45AJO0Cq9up/tK4ck4MaDHYEM&amp;#43;f51Pjr8g/OmwH99ID1AGeenJ4pMadhGYBsBc/U49f8KYnEefLUsOOuO/PanN/rD/n1pF&amp;#43;4fqP50yRwEZzlBgnj/P4023VhfzMSNhiTaO/V/wD61KPuj6/1FOh/4&amp;#43;X/AOuSfzamFj//2Q==&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;class=&#34;lazy&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;data-src=&#34;https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/images/gravel-biking_hu_786135e6f72c4008.png&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&#x9;&#xA;&#x9;&#xA;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&lt;div&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/images/e-biking.png&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;class=&#34;galleryImg&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;img&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;width=&#34;600&#34; height=&#34;408&#34;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;style=&#34;filter: blur(25px);&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;src=&#34;data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABYAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/APYVD45Kn8KaEbcGJHGcfpTDKnPy5xwTg/5//XTHnjQFiDjpQS2iwAwGMLVW13f2xdkk48mLjPAO6TP9Kc0ignJAxwcZ9/8ACltBm5lfJOY1GT7Fv8aAvqhAh3k7sAnlQOOn/wBagRHOQ&amp;#43;FHUBRzUn8X&amp;#43;fekX7p/z3oCyI3R2YFZCBuyQVByPT9asQptZj2IGPpzUQ&amp;#43;6P89xViPoP90UDsf/2Q==&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;class=&#34;lazy&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;data-src=&#34;https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/images/e-biking_hu_84051562c4e68f48.png&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&#x9;&#xA;&#x9;&#xA;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&lt;div&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;a href=&#34;https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/images/biking.png&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;class=&#34;galleryImg&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;img&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;width=&#34;600&#34; height=&#34;408&#34;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;style=&#34;filter: blur(25px);&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;src=&#34;data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABYAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/APWLhZDCW3gouOAp3ZHvmqwuUtowhkZmIzuZevHU/r/nmtDacfdVvxx/n/69McqEbKqNqk57dKdxWK0C&amp;#43;aouBMwz8wRhjGT05qa1QrqE53EgxoOTxkM/&amp;#43;NSbGwCVXOORnPP1p0BHnSDuAOPTk0n0GtNAymcY/wA/5zTVEWD&amp;#43;7A7UH75&amp;#43;v&amp;#43;NIvRvr/WgBQY8bgmC3Wm26sL6ZiRtMSbR&amp;#43;L/8A1qB91f8APcU&amp;#43;H/j5f/rkn82pgf/Z&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;class=&#34;lazy&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;data-src=&#34;https://move.cyber-neurones.org/post/2024/12/2024-12-09-python-test-de-la-librairie-calplot/images/biking_hu_8472753c12e6f33c.png&#34;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&lt;/a&gt;&#xA;&#x9;&#x9;&#x9;&lt;/div&gt;&#xA;&#x9;&#x9;&#xA;&#x9;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;script&gt;&#xA;&#x9;if (!(&#34;HSCGjQuery&#34; in window)) {&#xA;&#x9;&#x9;if (!window.jQuery) {&#xA;&#x9;&#x9;&#x9;throw new Error(&#34;jQuery is not loaded, hugo-shortcode-gallery wont work without it!&#34;);&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;window.HSCGjQuery = window.jQuery.noConflict(true);&#xA;&#x9;}&#xA;&#xA;&#x9;&#xA;&#x9;&#xA;&#x9;&#xA;&#x9;&#xA;&#x9;&#xA;&#x9;;(function($) {&#xA;&#xA;&#x9;&#x9;$( document ).ready(() =&gt; {&#xA;&#x9;&#x9;&#x9;const gallery = $(&#34;#gallery-89f12a4ee3348036c51a639832740c2e-0&#34;);&#xA;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;let swipeboxInstance = null;&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;gallery.on(&#39;jg.complete&#39;, () =&gt; {&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;$(() =&gt; {&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;$(&#39;.lazy&#39;).Lazy({&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;visibleOnly: true,&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;afterLoad: element =&gt; element.css({filter: &#34;none&#34;, transition: &#34;filter 1.0s ease-in-out&#34;})&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;});&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;});&#xA;&#x9;&#x9;&#x9;&#x9;&#xA;&#xA;&#x9;&#x9;&#x9;&#x9;swipeboxInstance = $(&#39;.galleryImg&#39;).swipebox(&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;$.extend({},&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#x9;{  }&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;)&#xA;&#x9;&#x9;&#x9;&#x9;);&#xA;&#x9;&#x9;&#x9;});&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;gallery.justifiedGallery($.extend(&#xA;&#x9;&#x9;&#x9;&#x9;{&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;rowHeight : &#34;150&#34;,&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;margins : &#34;5&#34;,&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;border : 0,&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;randomize :  false ,&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;waitThumbnailsLoad : false,&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;lastRow : &#34;justify&#34;,&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;captions : false,&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#x9;},&#xA;&#x9;&#x9;&#x9;&#x9;{  }&#xA;&#x9;&#x9;&#x9;));&#xA;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;&#x9;&#xA;&#x9;&#x9;});&#xA;&#xA;&#x9;&#xA;&#x9;&#xA;&#x9;&#xA;&#x9;})(window.HSCGjQuery)&#xA;&lt;/script&gt;</description>
    </item>
    <item>
      <title>Python : matplotlib : Issue line 303 text.parse_math</title>
      <link>https://move.cyber-neurones.org/post/2023/12/2023-12-09-python-matplotlib-issue-line-303-text-parse_math/</link>
      <pubDate>Sat, 09 Dec 2023 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2023/12/2023-12-09-python-matplotlib-issue-line-303-text-parse_math/</guid>
      <description>&lt;p&gt;Sur Kali OS j&amp;rsquo;ai eu cette erreur :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#xA;Bad key text.parse_math in file /usr/share/matplotlib/mpl-data/matplotlibrc, line 303 (&amp;#39;text.parse_math: False # Use mathtext if there is an even number of unescaped&amp;#39;)&#xA;You probably need to get an updated matplotlibrc file from&#xA;https://github.com/matplotlib/matplotlib/blob/v3.5.2/matplotlibrc.template&#xA;or from the matplotlib source distribution&#xA;Traceback (most recent call last):&#xA;File &amp;#34;....Test.py&amp;#34;, line 31, in &amp;lt;module&amp;gt;&#xA;import gradio as gr&#xA;File &amp;#34;/usr/local/lib/python3.11/dist-packages/gradio/__init__.py&amp;#34;, line 3, in &amp;lt;module&amp;gt;&#xA;import gradio._simple_templates&#xA;File &amp;#34;/usr/local/lib/python3.11/dist-packages/gradio/_simple_templates/__init__.py&amp;#34;, line 1, in &amp;lt;module&amp;gt;&#xA;from .simpledropdown import SimpleDropdown&#xA;File &amp;#34;/usr/local/lib/python3.11/dist-packages/gradio/_simple_templates/simpledropdown.py&amp;#34;, line 6, in &amp;lt;module&amp;gt;&#xA;from gradio.components.base import FormComponent&#xA;File &amp;#34;/usr/local/lib/python3.11/dist-packages/gradio/components/__init__.py&amp;#34;, line 1, in &amp;lt;module&amp;gt;&#xA;from gradio.components.annotated_image import AnnotatedImage&#xA;File &amp;#34;/usr/local/lib/python3.11/dist-packages/gradio/components/annotated_image.py&amp;#34;, line 11, in &amp;lt;module&amp;gt;&#xA;from gradio import processing_utils, utils&#xA;File &amp;#34;/usr/local/lib/python3.11/dist-packages/gradio/processing_utils.py&amp;#34;, line 23, in &amp;lt;module&amp;gt;&#xA;from gradio.utils import abspath&#xA;File &amp;#34;/usr/local/lib/python3.11/dist-packages/gradio/utils.py&amp;#34;, line 38, in &amp;lt;module&amp;gt;&#xA;import matplotlib&#xA;File &amp;#34;/usr/lib/python3/dist-packages/matplotlib/__init__.py&amp;#34;, line 880, in &amp;lt;module&amp;gt;&#xA;rcParamsDefault = _rc_params_in_file(&#xA;^^^^^^^^^^^^^^^^^^^&#xA;File &amp;#34;/usr/lib/python3/dist-packages/matplotlib/__init__.py&amp;#34;, line 814, in _rc_params_in_file&#xA;config[key] = val # try to convert to proper type or raise&#xA;~~~~~~^^^^^&#xA;File &amp;#34;/usr/lib/python3/dist-packages/matplotlib/__init__.py&amp;#34;, line 650, in __setitem__&#xA;raise ValueError(f&amp;#34;Key {key}: {ve}&amp;#34;) from None&#xA;ValueError: Key grid.color: &amp;#39;&amp;#34;&amp;#39; does not look like a color arg&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;J&amp;rsquo;ai donc edité le fichier /usr/share/matplotlib/mpl-data/matplotlibrc pour mettre en commentaire la ligne ( sachant que False ou True on a la même erreur) :&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux/Python : Merge d&#39;un GPX et d&#39;une video</title>
      <link>https://move.cyber-neurones.org/post/2023/07/2023-07-06-linux-python-merge-dun-gpx-et-dune-video/</link>
      <pubDate>Thu, 06 Jul 2023 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2023/07/2023-07-06-linux-python-merge-dun-gpx-et-dune-video/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Etape 1&lt;/strong&gt; : Installation : &lt;a href=&#34;https://pypi.org/project/gopro-overlay/&#34;&gt;https://pypi.org/project/gopro-overlay/&lt;/a&gt;&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ python3 -m venv venv&#xA;$ venv/bin/pip install gopro-overlay&#xA;$ mkdir ~/.gopro-graphics/&#xA;$ cat ~/.gopro-graphics/ffmpeg-profiles.json&#xA;{&#xA;  &amp;#34;overlay&amp;#34;: {&#xA;    &amp;#34;input&amp;#34;: [],&#xA;    &amp;#34;output&amp;#34;: [&amp;#34;-vcodec&amp;#34;, &amp;#34;png&amp;#34;]&#xA;  }&#xA;}&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Etape 2&lt;/strong&gt; : Premier test et premier drame&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ venv/bin/gopro-dashboard.py --use-gpx-only --gpx Nextcloud/Pipe/Video/BoucleResideo.gpx 1920x1080 Nextcloud/Pipe/Video/BoucleResideo.mov &#xA;Starting gopro-dashboard version 0.100.0&#xA;ffmpeg version is 4.4.2-0ubuntu0.22.04.1&#xA;Using Python version 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0]&#xA;Traceback (most recent call last):&#xA;  File &amp;#34;/home/arias/venv/bin/gopro-dashboard.py&amp;#34;, line 107, in &#xA;    font = load_font(args.font)&#xA;  File &amp;#34;/home/arias/venv/lib/python3.10/site-packages/gopro_overlay/font.py&amp;#34;, line 5, in load_font&#xA;    return ImageFont.truetype(font=font, size=size)&#xA;  File &amp;#34;/home/arias/venv/lib/python3.10/site-packages/PIL/ImageFont.py&amp;#34;, line 1008, in truetype&#xA;    return freetype(font)&#xA;  File &amp;#34;/home/arias/venv/lib/python3.10/site-packages/PIL/ImageFont.py&amp;#34;, line 1005, in freetype&#xA;    return FreeTypeFont(font, size, index, encoding, layout_engine)&#xA;  File &amp;#34;/home/arias/venv/lib/python3.10/site-packages/PIL/ImageFont.py&amp;#34;, line 255, in __init__&#xA;    self.font = core.getfont(&#xA;OSError: cannot open resource&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Etape 2b&lt;/strong&gt; : Avec copie de la &amp;ldquo;font&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python/BRISQUE : Voir la &#34;qualité&#34; des photos NEXTCLOUD avec un script</title>
      <link>https://move.cyber-neurones.org/post/2022/06/2022-06-03-python-brisque-voir-la-qualite-des-photos-nextcloud-avec-un-script/</link>
      <pubDate>Fri, 03 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2022/06/2022-06-03-python-brisque-voir-la-qualite-des-photos-nextcloud-avec-un-script/</guid>
      <description>&lt;p&gt;C&amp;rsquo;est pas vraiment top, dès qu&amp;rsquo;il y a de l&amp;rsquo;herbe j&amp;rsquo;ai la valeur &amp;gt; 100. C&amp;rsquo;était donc une fausse bonne idée &amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Voici le script que j&amp;rsquo;ai fait :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/usr/bin/env python3.6&#xA;from libsvm import svmutil&#xA;from brisque import *&#xA;import sys&#xA;import os.path&#xA;import glob&#xA;&#xA;brisq = BRISQUE()&#xA;&#xA;for filename in glob.iglob(&amp;#39;./Nextcloud/Photos/**&amp;#39;, recursive=True):&#xA;     if (filename.endswith(&amp;#39;.jpg&amp;#39;)):&#xA;         temp=brisq.get_score(filename)&#xA;         if (temp &amp;gt; 100):&#xA;             print(filename)&#xA;             print(temp)&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Par exemple : BRISQUE = 107.82606599602599 pour cette photo : &lt;a href=&#34;https://www.cyber-neurones.org/wp-content/uploads/2022/06/p-20210714-095844.jpg&#34;&gt;&lt;img src=&#34;images/p-20210714-095844-1024x768.jpg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python/OpenCV : Brouillon : Détection des contours du blob</title>
      <link>https://move.cyber-neurones.org/post/2022/04/2022-04-24-python-opencv-brouillon-detection-des-contours-du-blob/</link>
      <pubDate>Sun, 24 Apr 2022 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2022/04/2022-04-24-python-opencv-brouillon-detection-des-contours-du-blob/</guid>
      <description>&lt;p&gt;C&amp;rsquo;est pas gagné pour faire la détection du contour du blob (en mv4) :&lt;/p&gt;&#xA;&lt;p&gt;[video width=&amp;ldquo;1060&amp;rdquo; height=&amp;ldquo;720&amp;rdquo; m4v=&amp;ldquo;&lt;a href=&#34;https://www.cyber-neurones.org/wp-content/uploads/2022/04/blob2outpytest.m4v%22&#34;&gt;https://www.cyber-neurones.org/wp-content/uploads/2022/04/blob2outpytest.m4v&amp;quot;&lt;/a&gt;][/video]&lt;/p&gt;&#xA;&lt;p&gt;J&amp;rsquo;ai des problèmes de jaune :(&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import cv2&#xA;import numpy as np &#xA;import matplotlib.pyplot as plt&#xA;....&#xA;        frame_hsv=cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)&#xA;&#xA;        low_yellow=np.array([10, 125, 100])&#xA;        upper_yellow=np.array([60, 220, 220])&#xA;        mask_yellow=cv2.inRange(frame_hsv,low_yellow,upper_yellow)&#xA;&#xA;        list_masks=[mask_yellow]&#xA;        for i,mask in enumerate(list_masks):&#xA;&#xA;            contours, _=cv2.findContours(mask,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Sans le polygone (et en mp4):&lt;/p&gt;&#xA;&lt;p&gt;[video width=&amp;ldquo;1280&amp;rdquo; height=&amp;ldquo;720&amp;rdquo; mp4=&amp;ldquo;&lt;a href=&#34;https://www.cyber-neurones.org/wp-content/uploads/2022/04/blob2outpytest2.mp4%22&#34;&gt;https://www.cyber-neurones.org/wp-content/uploads/2022/04/blob2outpytest2.mp4&amp;quot;&lt;/a&gt;][/video]&lt;/p&gt;&#xA;&lt;p&gt;A suivre.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python : Creation de PNG à base de CSV, avec des EXIF de localisation</title>
      <link>https://move.cyber-neurones.org/post/2021/02/2021-02-22-python-creation-de-png-a-base-de-csv-avec-des-exif-de-localisation/</link>
      <pubDate>Mon, 22 Feb 2021 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2021/02/2021-02-22-python-creation-de-png-a-base-de-csv-avec-des-exif-de-localisation/</guid>
      <description>&lt;p&gt;J&amp;rsquo;ai fait un petit programme pour faire des PNG à l&amp;rsquo;aide d&amp;rsquo;un fichier CSV. Le but est de mettre des balises sur Google Picture.&lt;/p&gt;&#xA;&lt;p&gt;Voici un exemple de fichier CSV :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cat list.csv &#xA;Nom,Année,Mois,Jours,Lieux,Pays&#xA;Deplacement sur Paris,2018,11,01,Paris,France&#xA;Deplacement sur Londres,2011,11,01,London,UK&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Voici le programme :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;from PIL import Image, ImageDraw, ImageFont&#xA;import piexif&#xA;from datetime import datetime&#xA;import csv&#xA;from geopy.geocoders import Nominatim&#xA;from GPSPhoto import gpsphoto&#xA;&#xA;geolocator = Nominatim(user_agent=&amp;#34;Your_Name&amp;#34;)&#xA;&#xA;with open(&amp;#39;list.csv&amp;#39;) as csv_file:&#xA;    csv_reader = csv.reader(csv_file, delimiter=&amp;#39;,&amp;#39;)&#xA;    line_count = 0&#xA;    for row in csv_reader:&#xA;        if line_count == 0:&#xA;            line_count += 1&#xA;        else:&#xA;            name = &amp;#39;%s \n Le %d/%d/%d \n a %s,%s . :&amp;#39; % (str(row[0]),int(row[1]),int(row[2]),int(row[3]),str(row[4]),str(row[5]))&#xA;            print(&amp;#39;\t %s &amp;#39; % name)&#xA;            line_count += 1&#xA;            filename = &amp;#39;image-%d.jpg&amp;#39; % (line_count)&#xA;&#xA;            img = Image.new(&amp;#39;RGB&amp;#39;, (1024, 800), color = (73, 109, 137))&#xA;&#xA;            d = ImageDraw.Draw(img)&#xA;            fontsize = 80 &#xA;            font = ImageFont.truetype(&amp;#39;/usr/share/fonts/truetype/msttcorefonts/Arial.ttf&amp;#39;, fontsize)&#xA;            d.text((10,10), name, font=font)&#xA;            img.save(filename)&#xA;&#xA;            exif_dict = piexif.load(filename)&#xA;            new_date = datetime(int(row[1]), int(row[2]), int(row[3]), 0, 0, 0).strftime(&amp;#34;%Y:%m:%d %H:%M:%S&amp;#34;)&#xA;            exif_dict[&amp;#39;0th&amp;#39;][piexif.ImageIFD.DateTime] = new_date&#xA;            exif_dict[&amp;#39;Exif&amp;#39;][piexif.ExifIFD.DateTimeOriginal] = new_date&#xA;            exif_dict[&amp;#39;Exif&amp;#39;][piexif.ExifIFD.DateTimeDigitized] = new_date&#xA;            exif_bytes = piexif.dump(exif_dict)&#xA;            piexif.insert(exif_bytes, filename)&#xA;            address= &amp;#39;%s,%s&amp;#39; % (row[4], row[5])&#xA;            location = geolocator.geocode(address)&#xA;            print(&amp;#39;\t\t %f %f %d&amp;#39; % (location.latitude, location.longitude, location.altitude))&#xA;            photo = gpsphoto.GPSPhoto(filename)&#xA;            info = gpsphoto.GPSInfo((location.latitude, location.longitude), alt=int(location.altitude), timeStamp=new_date)&#xA;            photo.modGPSData(info, filename)&#xA;&#xA;    print(&amp;#39;Processed %d lines.&amp;#39; % line_count)&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Pour qu&amp;rsquo;il fonctionne il faut avoir installé :&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slack : Migration des données de connexion vers MariaDB pour une utilisation dans Grafana</title>
      <link>https://move.cyber-neurones.org/post/2020/04/2020-04-08-slack-migration-des-donnees-de-connexion-vers-mariadb-pour-une-utilisation-dans-grafana/</link>
      <pubDate>Wed, 08 Apr 2020 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2020/04/2020-04-08-slack-migration-des-donnees-de-connexion-vers-mariadb-pour-une-utilisation-dans-grafana/</guid>
      <description>&lt;p&gt;Pour utiliser le script il faut:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;MariaDB&lt;/li&gt;&#xA;&lt;li&gt;Python&lt;/li&gt;&#xA;&lt;li&gt;Grafana.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Slack permet le téléchargement d&amp;rsquo;un fichier CSV ( &lt;strong&gt;access_logs.csv&lt;/strong&gt; ), dont les données sont les suivantes :&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Date Accessed,&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Agent - Simple,&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;User Agent - Full,&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;IP Address,&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Number of Logins,&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Last Date Accessed&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Petit rappel sur l&amp;rsquo;ajout d&amp;rsquo;une database et d&amp;rsquo;un utilisateur :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo mysql -u root&#xA;&#xA;MariaDB [(none)]&amp;gt; create database SLACK;&#xA;&#xA;MariaDB [(none)]&amp;gt; CREATE USER &amp;#39;slack&amp;#39;@&amp;#39;localhost&amp;#39; IDENTIFIED BY &amp;#39;slack&amp;#39;;&#xA;&#xA;MariaDB [(none)]&amp;gt; GRANT ALL PRIVILEGES ON SLACK.* TO &amp;#39;slack&amp;#39;@&amp;#39;localhost&amp;#39;;&#xA;&#xA;MariaDB [(none)]&amp;gt; FLUSH PRIVILEGES;&#xA;&#xA;MariaDB [(none)]&amp;gt; \quit&#xA;Bye&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Petit rappel aussi en python pour télécharger une classe non disponible :&lt;/p&gt;</description>
    </item>
    <item>
      <title>MacOS : Python : Découverte de l’API Python Elasticsearch/Kibana avec SVN pour des stats</title>
      <link>https://move.cyber-neurones.org/post/2019/11/2019-11-25-macos-python-decouverte-de-lapi-python-elasticsearch-kibana-avec-svn-pour-des-stats/</link>
      <pubDate>Mon, 25 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/11/2019-11-25-macos-python-decouverte-de-lapi-python-elasticsearch-kibana-avec-svn-pour-des-stats/</guid>
      <description>&lt;p&gt;Petit script pour envoyer l&amp;rsquo;historique d&amp;rsquo;un SVN vers Elasticsearch/Kibana. Avant j&amp;rsquo;utilisais statSVN : &lt;a href=&#34;https://statsvn.org&#34;&gt;https://statsvn.org .&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Pour l&amp;rsquo;installation sous Mac :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ pip2 install --upgrade pip&#xA;$ pip2 install elasticsearch&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Voici le programme :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import xml.etree.ElementTree as ET&#xA;import os&#xA;import re&#xA;from elasticsearch import Elasticsearch &#xA;import sys&#xA;&#xA;tree = ET.parse(&amp;#39;svn.log&amp;#39;)&#xA;root = tree.getroot()&#xA;&#xA;count = 0;&#xA;nb_error = 0&#xA;es=Elasticsearch([{&amp;#39;host&amp;#39;:&amp;#39;localhost&amp;#39;,&amp;#39;port&amp;#39;:9200}])&#xA;es_keys=&amp;#34;svn&amp;#34;&#xA;&#xA;for logentry in root.iter(&amp;#39;logentry&amp;#39;):&#xA;   revision = logentry.get(&amp;#39;revision&amp;#39;)&#xA;   author = logentry.find(&amp;#39;author&amp;#39;).text&#xA;   date = logentry.find(&amp;#39;date&amp;#39;).text&#xA;   msg = logentry.find(&amp;#39;msg&amp;#39;).text&#xA;   if msg is not None:&#xA;      msg = msg.replace(&amp;#34;\n&amp;#34;, &amp;#34; &amp;#34;)&#xA;      msg = msg.replace(&amp;#34;\r&amp;#34;, &amp;#34; &amp;#34;)&#xA;      msg = msg.rstrip(&amp;#39;\r\n&amp;#39;)&#xA;      msg = msg.strip(&amp;#39;\r\n&amp;#39;)&#xA;      msg = str(re.sub(r&amp;#39;[^\x00-\x7F]&amp;#39;,&amp;#39; &amp;#39;, msg))&#xA;   paths = logentry.find(&amp;#39;paths&amp;#39;) &#xA;   for path in paths.findall(&amp;#39;path&amp;#39;):&#xA;      my_path = path.text&#xA;      my_basename = os.path.basename(my_path)&#xA;      my_dir = os.path.dirname(my_path)&#xA;      count += 1&#xA;      if msg is not None:&#xA;         json = &amp;#39;{&amp;#34;revision&amp;#34;:&amp;#39;+revision+&amp;#39;,&amp;#34;author&amp;#34;:&amp;#34;&amp;#39;+author+&amp;#39;&amp;#34;,&amp;#34;date&amp;#34;:&amp;#34;&amp;#39;+date+&amp;#39;&amp;#34;,&amp;#34;msg&amp;#34;:&amp;#34;&amp;#39;+msg+&amp;#39;&amp;#34;,&amp;#34;basename&amp;#34;:&amp;#34;&amp;#39;+my_basename+&amp;#39;&amp;#34;,&amp;#34;folder&amp;#34;:&amp;#34;&amp;#39;+my_dir+&amp;#39;&amp;#34;}&amp;#39;&#xA;      else:&#xA;         json = &amp;#39;{&amp;#34;revision&amp;#34;:&amp;#39;+revision+&amp;#39;,&amp;#34;author&amp;#34;:&amp;#34;&amp;#39;+author+&amp;#39;&amp;#34;,&amp;#34;date&amp;#34;:&amp;#34;&amp;#39;+date+&amp;#39;&amp;#34;,&amp;#34;basename&amp;#34;:&amp;#34;&amp;#39;+my_basename+&amp;#39;&amp;#34;,&amp;#34;folder&amp;#34;:&amp;#34;&amp;#39;+my_dir+&amp;#39;&amp;#34;}&amp;#39;&#xA;      print(count,json)&#xA;      try:&#xA;        res = es.index(index=es_keys,doc_type=&amp;#39;svn&amp;#39;,id=count,body=json)&#xA;      except:&#xA;        nb_error += 1  &lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Il faut faire un export XML de SVN :&lt;/p&gt;</description>
    </item>
    <item>
      <title>MacOS : Python : Suppression des doublons d&#39;emails avec l’API Python Elasticsearch/Kibana (Version V3)</title>
      <link>https://move.cyber-neurones.org/post/2019/11/2019-11-25-macos-python-suppression-des-doublons-demails-avec-lapi-python-elasticsearch-kibana-version-v3/</link>
      <pubDate>Mon, 25 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/11/2019-11-25-macos-python-suppression-des-doublons-demails-avec-lapi-python-elasticsearch-kibana-version-v3/</guid>
      <description>&lt;p&gt;Finalement dans les 200.000 emails je pense avoir des doublons &amp;hellip; je vais donc profiter de l&amp;rsquo;export vers Elastciseach/Kibana pour voir si j&amp;rsquo;ai des doublons. L&amp;rsquo;email qu&amp;rsquo;il va avoir la même taille et le même checksum MD5 sera considéré comme un doublons.&lt;/p&gt;&#xA;&lt;p&gt;Voici donc la version V3 (sans la suppression de fichier : &lt;strong&gt;os.unlink(path)&lt;/strong&gt; )&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/usr/bin/env python3&#xA;&#xA;import email&#xA;import plistlib&#xA;import hashlib&#xA;import re&#xA;import glob, os&#xA;import string&#xA;from datetime import datetime&#xA;from email.utils import parsedate_to_datetime&#xA;from email.header import Header, decode_header, make_header&#xA;from elasticsearch import Elasticsearch &#xA;&#xA;class Emlx(object):&#xA;        def __init__(self):&#xA;            super(Emlx, self).__init__()&#xA;            self.bytecount = 0&#xA;            self.msg_data = None&#xA;            self.msg_plist = None&#xA;&#xA;        def parse(self, filename_path):&#xA;            with open(filename_path, &amp;#34;rb&amp;#34;) as f:&#xA;                self.bytecount = int(f.readline().strip())&#xA;                self.msg_data = email.message_from_bytes(f.read(self.bytecount))&#xA;                self.msg_plist = plistlib.loads(f.read())&#xA;            return self.msg_data, self.msg_plist&#xA;&#xA;def md5(fname):&#xA;    hash_md5 = hashlib.md5()&#xA;    with open(fname, &amp;#34;rb&amp;#34;) as f:&#xA;        for chunk in iter(lambda: f.read(4096), b&amp;#34;&amp;#34;):&#xA;            hash_md5.update(chunk)&#xA;    return hash_md5.hexdigest()&#xA;&#xA;if __name__ == &amp;#39;__main__&amp;#39;:&#xA;   msg = Emlx()&#xA;   nb_parse = 0&#xA;   nb_error = 0&#xA;   save_space = 0&#xA;   list_email = []&#xA;   printable = set(string.printable)&#xA;   path_mail = &amp;#34;/Users/MonLogin/Library/Mail/V6/&amp;#34;&#xA;   es_keys = &amp;#34;mail&amp;#34;&#xA;   es=Elasticsearch([{&amp;#39;host&amp;#39;:&amp;#39;localhost&amp;#39;,&amp;#39;port&amp;#39;:9200}])&#xA;   for root, dirs, files in os.walk(path_mail):&#xA;      for file in files:&#xA;          if file.endswith(&amp;#34;.emlx&amp;#34;):&#xA;             file_full = os.path.join(root, file)&#xA;             my_check = md5(root+&amp;#39;/&amp;#39;+file)&#xA;             my_count = list_email.count(my_check)&#xA;             list_email.append(my_check)&#xA;             message, plist = msg.parse(file_full)&#xA;             statinfo = os.stat(file_full)&#xA;             if (my_count &amp;gt; 0):&#xA;                save_space += int(statinfo.st_size)&#xA;                #os.unlink(root+&amp;#39;/&amp;#39;+file)&#xA;             my_date = message[&amp;#39;Date&amp;#39;]&#xA;             my_id = message[&amp;#39;Message-ID&amp;#39;]&#xA;             my_server = message[&amp;#39;Received&amp;#39;]&#xA;             my_date_str = &amp;#34;&amp;#34;&#xA;             if my_date is not None and my_date is not Header:&#xA;                 try:&#xA;                   my_date_str = datetime.fromtimestamp(parsedate_to_datetime(my_date).timestamp()).strftime(&amp;#39;%Y-%m-%dT%H:%M:%S&amp;#39;)&#xA;                 except :&#xA;                   my_date_str = &amp;#34;&amp;#34;&#xA;             my_email = str(message[&amp;#39;From&amp;#39;])&#xA;             my_email = str(make_header(decode_header(my_email)))&#xA;             if my_email is not None:&#xA;                 my_domain = re.search(&amp;#34;@[\w.\-\_]+&amp;#34;, str(my_email))&#xA;                 if my_domain is not None:&#xA;                      my_domain_str = str(my_domain.group ());&#xA;                      my_domain_str = my_domain_str.lower()&#xA;             if my_email is not None:&#xA;                 my_name = re.search(&amp;#34;[\w.\-\_]+@&amp;#34;, str(my_email))&#xA;                 if my_name is not None:&#xA;                      my_name_str = str(my_name.group ());&#xA;                      my_name_str = my_name_str.lower()&#xA;             json = &amp;#39;{&amp;#34;checksum&amp;#34;:&amp;#34;&amp;#39;+my_check+&amp;#39;&amp;#34;,&amp;#34;count&amp;#34;:&amp;#34;&amp;#39;+str(my_count)+&amp;#39;&amp;#34;,&amp;#34;size&amp;#34;:&amp;#39;+str(statinfo.st_size)&#xA;             if my_domain is not None:&#xA;                 #print(my_domain.group())&#xA;                 #print(my_name.group())&#xA;                 json = json+&amp;#39;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#39;+my_name_str+&amp;#39;&amp;#34;,&amp;#34;domain&amp;#34;:&amp;#34;&amp;#39;+my_domain_str+&amp;#39;&amp;#34;&amp;#39;&#xA;             else:&#xA;                 my_email = my_email.replace(&amp;#34;,&amp;#34;,&amp;#34;&amp;#34;)&#xA;                 my_email = my_email.replace(&amp;#39;&amp;#34;&amp;#39;,&amp;#39;&amp;#39;)&#xA;                 my_email = str(re.sub(r&amp;#39;[^\x00-\x7f]&amp;#39;,r&amp;#39;&amp;#39;, my_email)) &#xA;                 my_email = my_email.lower()&#xA;                 json = json+&amp;#39;,&amp;#34;name&amp;#34;:&amp;#34;&amp;#39;+my_email+&amp;#39;&amp;#34;,&amp;#34;domain&amp;#34;:&amp;#34;None&amp;#34;&amp;#39;;&#xA;             if my_date is not None and len(my_date_str) &amp;gt; 1:&#xA;                 json = json+&amp;#39;,&amp;#34;date&amp;#34;:&amp;#34;&amp;#39;+my_date_str+&amp;#39;&amp;#34;,&amp;#34;id&amp;#34;:&amp;#39;+str(nb_parse)&#xA;             else:&#xA;                 json = json+&amp;#39;,&amp;#34;id&amp;#34;:&amp;#39;+str(nb_parse)&#xA;             if my_server is not None and my_server is not Header:&#xA;                 ip = re.search(r&amp;#39;\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}&amp;#39;, str(my_server))&#xA;                 if ip is not None:&#xA;                    my_ip = ip.group()&#xA;                    json = json+&amp;#39;,&amp;#34;ip&amp;#34;:&amp;#34;&amp;#39;+str(my_ip)+&amp;#39;&amp;#34;&amp;#39;&#xA;                 else:&#xA;                    my_ip = &amp;#34;&amp;#34;&#xA;                 #ip = re.findall(r&amp;#39;\b25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\b&amp;#39;,my_server)&#xA;                 #ip = re.findall( r&amp;#39;[0-9]+(?:\.[0-9]+){1,3}&amp;#39;, my_server )&#xA;                 #ip = re.findall(r&amp;#39;[\d.-]+&amp;#39;, my_server) &#xA;             else:&#xA;                 json = json&#xA;             if my_id is not None and my_id is not Header:&#xA;                 try:&#xA;                    my_id =my_id.strip()&#xA;                    my_id =my_id.strip(&amp;#39;\n&amp;#39;)&#xA;                    json = json+&amp;#39;,&amp;#34;Message-ID&amp;#34;:&amp;#34;&amp;#39;+my_id+&amp;#39;&amp;#34;,&amp;#34;file&amp;#34;:&amp;#34;&amp;#39;+file+&amp;#39;&amp;#34;}&amp;#39;&#xA;                 except:&#xA;                    json = json+&amp;#39;,&amp;#34;file&amp;#34;:&amp;#34;&amp;#39;+file+&amp;#39;&amp;#34;}&amp;#39;&#xA;             else:&#xA;                 json = json+&amp;#39;,&amp;#34;file&amp;#34;:&amp;#34;&amp;#39;+file+&amp;#39;&amp;#34;}&amp;#39;&#xA;             print(json)&#xA;             try:&#xA;                res = es.index(index=es_keys,doc_type=&amp;#39;emlx&amp;#39;,id=nb_parse,body=json)&#xA;             except:&#xA;                nb_error += 1   &#xA;             nb_parse += 1&#xA;             #print(plist)&#xA;   print(nb_parse)&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;A suivre pour la V4 !&lt;/p&gt;</description>
    </item>
    <item>
      <title>MacOS : Python : Découverte de l&#39;API Python Elasticsearch</title>
      <link>https://move.cyber-neurones.org/post/2019/11/2019-11-24-macos-python-decouverte-de-lapi-python-elasticsearch/</link>
      <pubDate>Sun, 24 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/11/2019-11-24-macos-python-decouverte-de-lapi-python-elasticsearch/</guid>
      <description>&lt;p&gt;J&amp;rsquo;ai voulu faire un premier programme afin de découvrir l&amp;rsquo;API Elasticsearch, comme base d&amp;rsquo;information j&amp;rsquo;ai pris mes emails. C&amp;rsquo;est assez simple, toutes les personnes sous MacOS ont des emails &amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Voici donc le petit programme en Python (pour Michel) : il suffit de changer &lt;strong&gt;MonUser.&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/usr/bin/env python3&#xA;&#xA;import email&#xA;import plistlib&#xA;import re&#xA;import glob, os&#xA;from datetime import datetime&#xA;from email.utils import parsedate_to_datetime&#xA;from email.header import Header, decode_header, make_header&#xA;from elasticsearch import Elasticsearch &#xA;&#xA;class Emlx(object):&#xA;        def __init__(self):&#xA;            super(Emlx, self).__init__()&#xA;            self.bytecount = 0&#xA;            self.msg_data = None&#xA;            self.msg_plist = None&#xA;&#xA;        def parse(self, filename_path):&#xA;            with open(filename_path, &amp;#34;rb&amp;#34;) as f:&#xA;                self.bytecount = int(f.readline().strip())&#xA;                self.msg_data = email.message_from_bytes(f.read(self.bytecount))&#xA;                self.msg_plist = plistlib.loads(f.read())&#xA;            return self.msg_data, self.msg_plist&#xA;&#xA;if __name__ == &amp;#39;__main__&amp;#39;:&#xA;   msg = Emlx()&#xA;   nb_parse = 0&#xA;   path_mail = &amp;#34;/Users/MonUser/Library/Mail/V6/&amp;#34;&#xA;   es_keys = &amp;#34;mail&amp;#34;&#xA;   es=Elasticsearch([{&amp;#39;host&amp;#39;:&amp;#39;localhost&amp;#39;,&amp;#39;port&amp;#39;:9200}])&#xA;   for root, dirs, files in os.walk(path_mail):&#xA;      for file in files:&#xA;          if file.endswith(&amp;#34;.emlx&amp;#34;):&#xA;             file_full = os.path.join(root, file)&#xA;             message, plist = msg.parse(file_full)&#xA;             statinfo = os.stat(file_full)&#xA;             my_date = message[&amp;#39;Date&amp;#39;]&#xA;             my_id = message[&amp;#39;Message-ID&amp;#39;]&#xA;             my_server = message[&amp;#39;Received&amp;#39;]&#xA;             if my_date is not None and my_date is not Header:&#xA;                 my_date_str = datetime.fromtimestamp(parsedate_to_datetime(my_date).timestamp()).strftime(&amp;#39;%Y-%m-%dT%H:%M:%S&amp;#39;)&#xA;             my_email = str(message[&amp;#39;From&amp;#39;])&#xA;             if my_email is not None:&#xA;                 my_domain = re.search(&amp;#34;@[\w.\-\_]+&amp;#34;, str(my_email))&#xA;             if my_email is not None:&#xA;                 my_name = re.search(&amp;#34;[\w.\-\_]+@&amp;#34;, str(my_email))&#xA;             if my_domain is not None:&#xA;                 #print(my_domain.group())&#xA;                 #print(my_name.group())&#xA;                 json = &amp;#39;{&amp;#34;name&amp;#34;:&amp;#34;&amp;#39;+my_name.group()+&amp;#39;&amp;#34;,&amp;#34;domain&amp;#34;:&amp;#34;&amp;#39;+my_domain.group()+&amp;#39;&amp;#34;&amp;#39;&#xA;             else:&#xA;                 my_email = my_email.replace(&amp;#34;,&amp;#34;,&amp;#34;&amp;#34;)&#xA;                 my_email = my_email.replace(&amp;#39;&amp;#34;&amp;#39;,&amp;#39;&amp;#39;)&#xA;                 json = &amp;#39;{&amp;#34;name&amp;#34;:&amp;#34;&amp;#39;+my_email+&amp;#39;&amp;#34;,&amp;#34;domain&amp;#34;:&amp;#34;None&amp;#34;&amp;#39;;&#xA;             if my_date is not None:&#xA;                 json = json+&amp;#39;,&amp;#34;date&amp;#34;:&amp;#34;&amp;#39;+my_date_str+&amp;#39;&amp;#34;,&amp;#34;size&amp;#34;:&amp;#39;+str(statinfo.st_size)+&amp;#39;,&amp;#34;id&amp;#34;:&amp;#39;+str(nb_parse)&#xA;             else:&#xA;                 json = json+&amp;#39;,&amp;#34;size&amp;#34;:&amp;#39;+str(statinfo.st_size)+&amp;#39;,&amp;#34;id&amp;#34;:&amp;#39;+str(nb_parse)&#xA;             if my_server is not None and my_server is not Header:&#xA;                 ip = re.search(r&amp;#39;\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}&amp;#39;, str(my_server))&#xA;                 if ip is not None:&#xA;                    my_ip = ip.group()&#xA;                    json = json+&amp;#39;,&amp;#34;ip&amp;#34;:&amp;#34;&amp;#39;+str(my_ip)+&amp;#39;&amp;#34;&amp;#39;&#xA;                 else:&#xA;                    my_ip = &amp;#34;&amp;#34;&#xA;                 #ip = re.findall(r&amp;#39;\b25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\b&amp;#39;,my_server)&#xA;                 #ip = re.findall( r&amp;#39;[0-9]+(?:\.[0-9]+){1,3}&amp;#39;, my_server )&#xA;                 #ip = re.findall(r&amp;#39;[\d.-]+&amp;#39;, my_server) &#xA;             else:&#xA;                 json = json&#xA;             if my_id is not None and my_id is not Header:&#xA;                 my_id =my_id.strip()&#xA;                 my_id =my_id.strip(&amp;#39;\n&amp;#39;)&#xA;                 json = json+&amp;#39;,&amp;#34;Message-ID&amp;#34;:&amp;#34;&amp;#39;+my_id+&amp;#39;&amp;#34;,&amp;#34;file&amp;#34;:&amp;#34;&amp;#39;+file+&amp;#39;&amp;#34;}&amp;#39;&#xA;             else:&#xA;                 json = json+&amp;#39;,&amp;#34;file&amp;#34;:&amp;#34;&amp;#39;+file+&amp;#39;&amp;#34;}&amp;#39;&#xA;             print(json)&#xA;             res = es.index(index=es_keys,doc_type=&amp;#39;emlx&amp;#39;,id=nb_parse,body=json)&#xA;             nb_parse += 1&#xA;             #print(plist)&#xA;   print(nb_parse)&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Le but de ce programme c&amp;rsquo;est simplement de mieux comprendre l&amp;rsquo;API. Pour le lancer j&amp;rsquo;ai fait :&lt;/p&gt;</description>
    </item>
    <item>
      <title>MacOS : Python : Découverte de l’API Python Elasticsearch/Kibana (Version V2)</title>
      <link>https://move.cyber-neurones.org/post/2019/11/2019-11-24-macos-python-decouverte-de-lapi-python-elasticsearch-kibana-version-v2/</link>
      <pubDate>Sun, 24 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/11/2019-11-24-macos-python-decouverte-de-lapi-python-elasticsearch-kibana-version-v2/</guid>
      <description>&lt;p&gt;J&amp;rsquo;ai finalement fait une version V2 qui corrige quelques problèmes (Exception de quelques emails our quelques noms de domaines). Il faut mettre son &lt;strong&gt;MonLogin .&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/usr/bin/env python3&#xA;&#xA;import email&#xA;import plistlib&#xA;import re&#xA;import glob, os&#xA;import string&#xA;from datetime import datetime&#xA;from email.utils import parsedate_to_datetime&#xA;from email.header import Header, decode_header, make_header&#xA;from elasticsearch import Elasticsearch &#xA;&#xA;class Emlx(object):&#xA;        def __init__(self):&#xA;            super(Emlx, self).__init__()&#xA;            self.bytecount = 0&#xA;            self.msg_data = None&#xA;            self.msg_plist = None&#xA;&#xA;        def parse(self, filename_path):&#xA;            with open(filename_path, &amp;#34;rb&amp;#34;) as f:&#xA;                self.bytecount = int(f.readline().strip())&#xA;                self.msg_data = email.message_from_bytes(f.read(self.bytecount))&#xA;                self.msg_plist = plistlib.loads(f.read())&#xA;            return self.msg_data, self.msg_plist&#xA;&#xA;if __name__ == &amp;#39;__main__&amp;#39;:&#xA;   msg = Emlx()&#xA;   nb_parse = 0&#xA;   nb_error = 0&#xA;   printable = set(string.printable)&#xA;   path_mail = &amp;#34;/Users/MonLogin/Library/Mail/V6/&amp;#34;&#xA;   es_keys = &amp;#34;mail&amp;#34;&#xA;   es=Elasticsearch([{&amp;#39;host&amp;#39;:&amp;#39;localhost&amp;#39;,&amp;#39;port&amp;#39;:9200}])&#xA;   for root, dirs, files in os.walk(path_mail):&#xA;      for file in files:&#xA;          if file.endswith(&amp;#34;.emlx&amp;#34;):&#xA;             file_full = os.path.join(root, file)&#xA;             message, plist = msg.parse(file_full)&#xA;             statinfo = os.stat(file_full)&#xA;             my_date = message[&amp;#39;Date&amp;#39;]&#xA;             my_id = message[&amp;#39;Message-ID&amp;#39;]&#xA;             my_server = message[&amp;#39;Received&amp;#39;]&#xA;             my_date_str = &amp;#34;&amp;#34;&#xA;             if my_date is not None and my_date is not Header:&#xA;                 try:&#xA;                   my_date_str = datetime.fromtimestamp(parsedate_to_datetime(my_date).timestamp()).strftime(&amp;#39;%Y-%m-%dT%H:%M:%S&amp;#39;)&#xA;                 except :&#xA;                   my_date_str = &amp;#34;&amp;#34;&#xA;             my_email = str(message[&amp;#39;From&amp;#39;])&#xA;             if my_email is not None:&#xA;                 my_domain = re.search(&amp;#34;@[\w.\-\_]+&amp;#34;, str(my_email))&#xA;                 if my_domain is not None:&#xA;                      my_domain_str = str(my_domain.group ());&#xA;                      my_domain_str = my_domain_str.lower()&#xA;             if my_email is not None:&#xA;                 my_name = re.search(&amp;#34;[\w.\-\_]+@&amp;#34;, str(my_email))&#xA;                 if my_name is not None:&#xA;                      my_name_str = str(my_name.group ());&#xA;                      my_name_str = my_name_str.lower()&#xA;             if my_domain is not None:&#xA;                 #print(my_domain.group())&#xA;                 #print(my_name.group())&#xA;                 json = &amp;#39;{&amp;#34;name&amp;#34;:&amp;#34;&amp;#39;+my_name_str+&amp;#39;&amp;#34;,&amp;#34;domain&amp;#34;:&amp;#34;&amp;#39;+my_domain_str+&amp;#39;&amp;#34;&amp;#39;&#xA;             else:&#xA;                 my_email = my_email.replace(&amp;#34;,&amp;#34;,&amp;#34;&amp;#34;)&#xA;                 my_email = my_email.replace(&amp;#39;&amp;#34;&amp;#39;,&amp;#39;&amp;#39;)&#xA;                 my_email = str(re.sub(r&amp;#39;[^\x00-\x7f]&amp;#39;,r&amp;#39;&amp;#39;, my_email)) &#xA;                 my_email = my_email.lower()&#xA;                 json = &amp;#39;{&amp;#34;name&amp;#34;:&amp;#34;&amp;#39;+my_email+&amp;#39;&amp;#34;,&amp;#34;domain&amp;#34;:&amp;#34;None&amp;#34;&amp;#39;;&#xA;             if my_date is not None and len(my_date_str) &amp;gt; 1:&#xA;                 json = json+&amp;#39;,&amp;#34;date&amp;#34;:&amp;#34;&amp;#39;+my_date_str+&amp;#39;&amp;#34;,&amp;#34;size&amp;#34;:&amp;#39;+str(statinfo.st_size)+&amp;#39;,&amp;#34;id&amp;#34;:&amp;#39;+str(nb_parse)&#xA;             else:&#xA;                 json = json+&amp;#39;,&amp;#34;size&amp;#34;:&amp;#39;+str(statinfo.st_size)+&amp;#39;,&amp;#34;id&amp;#34;:&amp;#39;+str(nb_parse)&#xA;             if my_server is not None and my_server is not Header:&#xA;                 ip = re.search(r&amp;#39;\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}&amp;#39;, str(my_server))&#xA;                 if ip is not None:&#xA;                    my_ip = ip.group()&#xA;                    json = json+&amp;#39;,&amp;#34;ip&amp;#34;:&amp;#34;&amp;#39;+str(my_ip)+&amp;#39;&amp;#34;&amp;#39;&#xA;                 else:&#xA;                    my_ip = &amp;#34;&amp;#34;&#xA;                 #ip = re.findall(r&amp;#39;\b25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\b&amp;#39;,my_server)&#xA;                 #ip = re.findall( r&amp;#39;[0-9]+(?:\.[0-9]+){1,3}&amp;#39;, my_server )&#xA;                 #ip = re.findall(r&amp;#39;[\d.-]+&amp;#39;, my_server) &#xA;             else:&#xA;                 json = json&#xA;             if my_id is not None and my_id is not Header:&#xA;                 try:&#xA;                    my_id =my_id.strip()&#xA;                    my_id =my_id.strip(&amp;#39;\n&amp;#39;)&#xA;                    json = json+&amp;#39;,&amp;#34;Message-ID&amp;#34;:&amp;#34;&amp;#39;+my_id+&amp;#39;&amp;#34;,&amp;#34;file&amp;#34;:&amp;#34;&amp;#39;+file+&amp;#39;&amp;#34;}&amp;#39;&#xA;                 except:&#xA;                    json = json+&amp;#39;,&amp;#34;file&amp;#34;:&amp;#34;&amp;#39;+file+&amp;#39;&amp;#34;}&amp;#39;&#xA;             else:&#xA;                 json = json+&amp;#39;,&amp;#34;file&amp;#34;:&amp;#34;&amp;#39;+file+&amp;#39;&amp;#34;}&amp;#39;&#xA;             print(json)&#xA;             try:&#xA;                res = es.index(index=es_keys,doc_type=&amp;#39;emlx&amp;#39;,id=nb_parse,body=json)&#xA;             except:&#xA;                nb_error += 1   &#xA;             nb_parse += 1&#xA;             #print(plist)&#xA;   print(nb_parse)&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt; &lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenDataGouv : Transaction immobilière sur Biot</title>
      <link>https://move.cyber-neurones.org/post/2019/04/2019-04-28-opendatagouv-transaction-immobiliere-sur-biot/</link>
      <pubDate>Sun, 28 Apr 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/04/2019-04-28-opendatagouv-transaction-immobiliere-sur-biot/</guid>
      <description>&lt;p&gt;En quelques étapes &amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Etape 1&lt;/strong&gt;: Voir un tweet passer de &lt;a href=&#34;https://twitter.com/ollybret&#34;&gt;@&lt;strong&gt;ollybret&lt;/strong&gt;&lt;/a&gt; :&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.cyber-neurones.org/wp-content/uploads/2019/04/capture-decran-2019-04-28-a-10-39-32.png&#34;&gt;&lt;img src=&#34;images/capture-decran-2019-04-28-a-10-39-32.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Etape 2&lt;/strong&gt; : Vérifier l&amp;rsquo;information sur &lt;a href=&#34;https://twitter.com/datagouvfr&#34;&gt;@&lt;strong&gt;datagouvfr&lt;/strong&gt;&lt;/a&gt; : le lien étant : &lt;a href=&#34;https://www.data.gouv.fr/fr/datasets/demandes-de-valeurs-foncieres/&#34;&gt;https://www.data.gouv.fr/fr/datasets/demandes-de-valeurs-foncieres/&lt;/a&gt; &lt;/p&gt;&#xA;&lt;p&gt;Et se faire un profil :&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.cyber-neurones.org/wp-content/uploads/2019/04/capture-decran-2019-04-28-a-10-47-52.png&#34;&gt;&lt;img src=&#34;images/capture-decran-2019-04-28-a-10-47-52.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Etape 3&lt;/strong&gt; : Voir du &lt;strong&gt;JSON&lt;/strong&gt; : Micro-API DVF (Demande de Valeurs Foncières) et une API :&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.data.gouv.fr/fr/reuses/micro-api-dvf-demande-de-valeurs-foncieres/&#34;&gt;https://www.data.gouv.fr/fr/reuses/micro-api-dvf-demande-de-valeurs-foncieres/&lt;/a&gt; &lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Voir même le résultat en fonction de la commune ou du code postal :&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://api.cquest.org/dvf?code&#34;&gt;http://api.cquest.org/dvf?code&lt;/a&gt;_commune=94068 ( code_commune = code INSEE de la commune (ex: 94068) )&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://api.cquest.org/dvf?code&#34;&gt;http://api.cquest.org/dvf?code&lt;/a&gt;_postal=89110 ( code_postal = code postal )&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Superbe travail de Christian Quest ( sur Twitter &lt;a href=&#34;https://twitter.com/cq94&#34;&gt;@&lt;strong&gt;cq94&lt;/strong&gt;&lt;/a&gt; ‏) avec en plus la mise du code sur GitHub : &lt;a href=&#34;https://github.com/cquest/dvf_as_api&#34;&gt;https://github.com/cquest/dvf_as_api&lt;/a&gt; .( &lt;a href=&#34;https://twitter.com/github&#34;&gt;@&lt;strong&gt;github&lt;/strong&gt;&lt;/a&gt; )&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python : How to migrate data of Awesome Note 2 (bridworks.com) to Joplin ?</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-14-python-how-to-migrate-data-of-awesome-note-bridworks-com-to-joplin/</link>
      <pubDate>Thu, 14 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-14-python-how-to-migrate-data-of-awesome-note-bridworks-com-to-joplin/</guid>
      <description>&lt;p&gt;Awesome Note 2, it&amp;rsquo;s very popular on iPad :&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;images/capture-decran-2019-02-14-a-19-34-52-1024x565.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The new All-in-one Organizer, Awesome Note 2 is integrated with note and schedule management.&lt;br&gt;&#xA;And now it’s available!!&lt;/p&gt;&#xA;&lt;p&gt;WONDERFUL WRITING FEATURES&lt;br&gt;&#xA;· It can be used not only for simple notes, but also rich and wonderful writing tool.&lt;br&gt;&#xA;· Make notes even more powerful to add photos, voice recording and drawings.&lt;br&gt;&#xA;· Easily create diary notes to display feeling, weather or road map information.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Joplin &amp; Python ( gmplot Google Map)  : How to create a Maps with REST API and data in Joplin ?</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-13-joplin-python-gmplot-google-map-how-to-create-a-maps-with-rest-api-and-data-in-joplin/</link>
      <pubDate>Wed, 13 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-13-joplin-python-gmplot-google-map-how-to-create-a-maps-with-rest-api-and-data-in-joplin/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Step 0&lt;/strong&gt; : Install Joplin and activate the REST API ( &lt;a href=&#34;https://joplin.cozic.net/api/&#34;&gt;https://joplin.cozic.net/api/&lt;/a&gt; ) .&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Install gmplot with pip&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ pip install gmplot&#xA;Collecting gmplot&#xA;  Downloading https://files.pythonhosted.org/packages/e2/b1/e1429c31a40b3ef5840c16f78b506d03be9f27e517d3870a6fd0b356bd46/gmplot-1.2.0.tar.gz (115kB)&#xA;    100% |████████████████████████████████| 122kB 1.0MB/s &#xA;Requirement already satisfied: requests in /usr/local/lib/python3.7/site-packages (from gmplot) (2.21.0)&#xA;Requirement already satisfied: urllib3&amp;lt;1.25,&amp;gt;=1.21.1 in /usr/local/lib/python3.7/site-packages (from requests-&amp;gt;gmplot) (1.24.1)&#xA;Requirement already satisfied: certifi&amp;gt;=2017.4.17 in /usr/local/lib/python3.7/site-packages (from requests-&amp;gt;gmplot) (2018.11.29)&#xA;Requirement already satisfied: idna&amp;lt;2.9,&amp;gt;=2.5 in /usr/local/lib/python3.7/site-packages (from requests-&amp;gt;gmplot) (2.8)&#xA;Requirement already satisfied: chardet&amp;lt;3.1.0,&amp;gt;=3.0.2 in /usr/local/lib/python3.7/site-packages (from requests-&amp;gt;gmplot) (3.0.4)&#xA;Building wheels for collected packages: gmplot&#xA;  Building wheel for gmplot (setup.py) ... done&#xA;  Stored in directory: /Users/...../Library/Caches/pip/wheels/81/6a/76/4dd6a7cc310ba765894159ee84871e8cd55221d82ef14b81a1&#xA;Successfully built gmplot&#xA;Installing collected packages: gmplot&#xA;Successfully installed gmplot-1.2.0&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;The source code : (change your token)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Joplin &amp; Python ( Static Map )  : How to create a Maps (JPEG) with REST API and data in Joplin ?</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-13-joplin-python-static-map-how-to-create-a-maps-jpeg-with-rest-api-and-data-in-joplin/</link>
      <pubDate>Wed, 13 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-13-joplin-python-static-map-how-to-create-a-maps-jpeg-with-rest-api-and-data-in-joplin/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Step 0&lt;/strong&gt; : Install Joplin and activate the REST API ( &lt;a href=&#34;https://joplin.cozic.net/api/&#34;&gt;https://joplin.cozic.net/api/&lt;/a&gt; ) .&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Install staticmap with pip ( for more information see &lt;a href=&#34;https://github.com/komoot/staticmap&#34;&gt;https://github.com/komoot/staticmap&lt;/a&gt; )&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ pip install staticmap&#xA;Collecting staticmap&#xA;  Downloading https://files.pythonhosted.org/packages/f9/9f/5a3843533eab037cba031486175c4db1b214614404a29516208ff228dead/staticmap-0.5.4.tar.gz&#xA;Collecting Pillow (from staticmap)&#xA;  Downloading https://files.pythonhosted.org/packages/c9/ed/27cc92e99b9ccaa0985a66133baeea7e8a3371d3c04cfa353aaa3b81aac1/Pillow-5.4.1-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (3.7MB)&#xA;    100% |████████████████████████████████| 3.7MB 6.3MB/s &#xA;Requirement already satisfied: requests in /usr/local/lib/python3.7/site-packages (from staticmap) (2.21.0)&#xA;Requirement already satisfied: chardet&amp;lt;3.1.0,&amp;gt;=3.0.2 in /usr/local/lib/python3.7/site-packages (from requests-&amp;gt;staticmap) (3.0.4)&#xA;Requirement already satisfied: idna&amp;lt;2.9,&amp;gt;=2.5 in /usr/local/lib/python3.7/site-packages (from requests-&amp;gt;staticmap) (2.8)&#xA;Requirement already satisfied: urllib3&amp;lt;1.25,&amp;gt;=1.21.1 in /usr/local/lib/python3.7/site-packages (from requests-&amp;gt;staticmap) (1.24.1)&#xA;Requirement already satisfied: certifi&amp;gt;=2017.4.17 in /usr/local/lib/python3.7/site-packages (from requests-&amp;gt;staticmap) (2018.11.29)&#xA;Building wheels for collected packages: staticmap&#xA;  Building wheel for staticmap (setup.py) ... done&#xA;  Stored in directory: /Users/..../Library/Caches/pip/wheels/fe/a6/a5/2acceb72471d85bd0498973aabd611e6ff1cdd48796790f047&#xA;Successfully built staticmap&#xA;Installing collected packages: Pillow, staticmap&#xA;Successfully installed Pillow-5.4.1 staticmap-0.5.4&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;The source code :&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to import data of Google&#43; to Joplin ?</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-11-how-to-import-data-of-google-to-joplin/</link>
      <pubDate>Mon, 11 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-11-how-to-import-data-of-google-to-joplin/</guid>
      <description>&lt;p&gt;Install JOPLIN : &lt;a href=&#34;https://joplin.cozic.net&#34;&gt;https://joplin.cozic.net ,&lt;/a&gt;  and start REST API.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Step 1 :&lt;/strong&gt; Download all with &lt;a href=&#34;https://takeout.google.com&#34;&gt;https://takeout.google.com&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Step 2 :&lt;/strong&gt; Uncompress and put all on same folder.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Step 3 :&lt;/strong&gt; Put this script in folder.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt; : Edit the script and put your token&lt;/p&gt;&#xA;&lt;p&gt;The script :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#&#xA;# Version 1 &#xA;# for Python 3&#xA;# &#xA;#   ARIAS Frederic&#xA;#   Sorry ... It&amp;#39;s difficult for me the python :)&#xA;#&#xA;&#xA;from os import listdir&#xA;from pathlib import Path&#xA;import glob&#xA;import csv&#xA;import locale&#xA;import os&#xA;import time&#xA;from datetime import datetime&#xA;import json&#xA;import requests&#xA;&#xA;nb_metadata = 0&#xA;nb_metadata_import = 0&#xA;def month_string_to_number(string):&#xA;    m = {&#xA;        &amp;#39;janv.&amp;#39;: 1,&#xA;        &amp;#39;feb.&amp;#39;: 2,&#xA;        &amp;#39;févr.&amp;#39;: 2,&#xA;        &amp;#39;mar.&amp;#39;: 3,&#xA;        &amp;#39;mars&amp;#39;: 3,&#xA;        &amp;#39;apr.&amp;#39;:4,&#xA;        &amp;#39;avr.&amp;#39;:4,&#xA;         &amp;#39;may.&amp;#39;:5,&#xA;         &amp;#39;mai&amp;#39;:5,&#xA;         &amp;#39;juin&amp;#39;:6,&#xA;         &amp;#39;juil.&amp;#39;:7,&#xA;         &amp;#39;aug.&amp;#39;:8,&#xA;         &amp;#39;août&amp;#39;:8,&#xA;         &amp;#39;sept.&amp;#39;:9,&#xA;         &amp;#39;oct.&amp;#39;:10,&#xA;         &amp;#39;nov.&amp;#39;:11,&#xA;         &amp;#39;déc.&amp;#39;:12&#xA;        }&#xA;    s = string.strip()[:5].lower()&#xA;&#xA;    try:&#xA;        out = m[s]&#xA;        return out&#xA;    except:&#xA;        raise ValueError(&amp;#39;Not a month&amp;#39;)&#xA;&#xA;locale.setlocale(locale.LC_TIME, &amp;#39;fr_FR.UTF-8&amp;#39;)&#xA;#today = datetime.date.today()&#xA;#print(today.strftime(&amp;#39;The date :%d %b. %Y à %H:%M:%S UTC&amp;#39;))&#xA;from time import strftime,localtime&#xA;print(localtime())&#xA;print(strftime(&amp;#34;%H:%M:%S, %d %b. %Y&amp;#34;,localtime()))&#xA;date = datetime.strptime(&amp;#39;2017-05-04&amp;#39;,&amp;#34;%Y-%m-%d&amp;#34;)&#xA;&#xA;#Token&#xA;ip = &amp;#34;127.0.0.1&amp;#34;&#xA;port = &amp;#34;41184&amp;#34;&#xA;token = &amp;#34;Put your token here&amp;#34;&#xA;&#xA;nb_import = 0;&#xA;headers = {&amp;#39;Content-type&amp;#39;: &amp;#39;application/json&amp;#39;, &amp;#39;Accept&amp;#39;: &amp;#39;text/plain&amp;#39;}&#xA;&#xA;url_notes = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/notes?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;url_folders = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/folders?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;url_tags = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/tags?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;url_ressources = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/ressources?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;&#xA;#Init&#xA;GooglePlus_UID = &amp;#34;12345678901234567801234567890123&amp;#34;&#xA;UID = {}&#xA;&#xA;payload = {&#xA;    &amp;#34;id&amp;#34;:GooglePlus_UID,&#xA;    &amp;#34;title&amp;#34;:&amp;#34;GooglePlus Import&amp;#34;&#xA;}&#xA;&#xA;try:&#xA;    resp = requests.post(url_folders, data=json.dumps(payload, separators=(&amp;#39;,&amp;#39;,&amp;#39;:&amp;#39;)), headers=headers)&#xA;    resp.raise_for_status()&#xA;    resp_dict = resp.json()&#xA;    print(resp_dict)&#xA;    print(&amp;#34;My ID&amp;#34;)&#xA;    print(resp_dict[&amp;#39;id&amp;#39;])&#xA;    GooglePlus_UID_real = resp_dict[&amp;#39;id&amp;#39;]&#xA;    save = str(resp_dict[&amp;#39;id&amp;#39;])&#xA;    UID[GooglePlus_UID]= save&#xA;except requests.exceptions.HTTPError as e:&#xA;    print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;except requests.exceptions.RequestException as e:&#xA;    print(&amp;#34;Network error:&amp;#34;, e)&#xA;&#xA;for csvfilename in glob.iglob(&amp;#39;Takeout*/**/*.metadata.csv&amp;#39;, recursive=True):&#xA;  nb_metadata += 1&#xA;  print(nb_metadata,&amp;#34; &amp;#34;,csvfilename)&#xA;  #print(&amp;#34;Picture:&amp;#34;+os.path.basename(csvfilename))&#xA;  mybasename = os.path.basename(csvfilename)&#xA;  mylist = mybasename.split(&amp;#34;.&amp;#34;)&#xA;  myfilename = mylist[0] + &amp;#34;.&amp;#34; + mylist[1]&#xA;  filename = os.path.dirname(csvfilename)+&amp;#34;/&amp;#34;+myfilename&#xA;  my_file = Path(filename)&#xA;  with open(csvfilename) as csvfile:&#xA;    reader = csv.DictReader(csvfile)&#xA;    for row in reader:&#xA;        if (len(row[&amp;#39;description&amp;#39;]) &amp;gt; 0):&#xA;            print(row[&amp;#39;title&amp;#39;], row[&amp;#39;description&amp;#39;], row[&amp;#39;creation_time.formatted&amp;#39;], row[&amp;#39;geo_data.latitude&amp;#39;], row[&amp;#39;geo_data.longitude&amp;#39;])&#xA;            #date = datetime.strptime(row[&amp;#39;creation_time.formatted&amp;#39;], &amp;#34;%d %b %Y à %H:%M:%S %Z&amp;#34;).timetuple()&#xA;            #print(date)&#xA;            mylist2 = row[&amp;#39;creation_time.formatted&amp;#39;].split(&amp;#34; &amp;#34;);&#xA;            mylist3 = mylist2[4].split(&amp;#34;:&amp;#34;);&#xA;            date = date.replace(hour=int(mylist3[0]), year=int(mylist2[2]), month=month_string_to_number(mylist2[1]), day=int(mylist2[0]))&#xA;            timestamp = time.mktime(date.timetuple())*1000&#xA;            print(timestamp)&#xA;            nb_metadata_import += 1&#xA;            mybody = row[&amp;#39;description&amp;#39;]&#xA;            if (len(row[&amp;#39;geo_data.latitude&amp;#39;]) &amp;gt; 2):&#xA;              payload_note = {&#xA;                &amp;#34;parent_id&amp;#34;:GooglePlus_UID_real,&#xA;                &amp;#34;title&amp;#34;:row[&amp;#39;creation_time.formatted&amp;#39;],&#xA;                &amp;#34;source&amp;#34;:myfilename,&#xA;                &amp;#34;source_url&amp;#34;:row[&amp;#39;url&amp;#39;],&#xA;                &amp;#34;order&amp;#34;:nb_metadata_import,&#xA;                &amp;#34;body&amp;#34;:mybody&#xA;                }&#xA;              payload_note_put = {&#xA;                &amp;#34;latitude&amp;#34;:float(row[&amp;#39;geo_data.latitude&amp;#39;]),&#xA;                &amp;#34;longitude&amp;#34;:float(row[&amp;#39;geo_data.longitude&amp;#39;]),&#xA;                &amp;#34;source&amp;#34;:myfilename,&#xA;                &amp;#34;source_url&amp;#34;:row[&amp;#39;url&amp;#39;],&#xA;                &amp;#34;order&amp;#34;:nb_metadata_import,&#xA;                &amp;#34;user_created_time&amp;#34;:timestamp,&#xA;                &amp;#34;user_updated_time&amp;#34;:timestamp,&#xA;                &amp;#34;author&amp;#34;:&amp;#34;Google+&amp;#34;&#xA;                }&#xA;            else:&#xA;               payload_note = {&#xA;                &amp;#34;parent_id&amp;#34;:GooglePlus_UID_real,&#xA;                &amp;#34;title&amp;#34;:row[&amp;#39;creation_time.formatted&amp;#39;],&#xA;                &amp;#34;source&amp;#34;:myfilename,&#xA;                &amp;#34;source_url&amp;#34;:row[&amp;#39;url&amp;#39;],&#xA;                &amp;#34;order&amp;#34;:nb_metadata_import,&#xA;                &amp;#34;user_created_time&amp;#34;:timestamp,&#xA;                &amp;#34;user_updated_time&amp;#34;:timestamp,&#xA;                &amp;#34;author&amp;#34;:&amp;#34;Google+&amp;#34;,&#xA;                &amp;#34;body&amp;#34;:mybody&#xA;                }&#xA;               payload_note_put = {&#xA;                &amp;#34;source&amp;#34;:myfilename,&#xA;                &amp;#34;order&amp;#34;:nb_metadata_import,&#xA;                &amp;#34;source_url&amp;#34;:row[&amp;#39;url&amp;#39;],&#xA;                &amp;#34;user_created_time&amp;#34;:timestamp,&#xA;                &amp;#34;user_updated_time&amp;#34;:timestamp,&#xA;                &amp;#34;author&amp;#34;:&amp;#34;Google+&amp;#34;&#xA;                }&#xA;&#xA;            try:&#xA;                resp = requests.post(url_notes, json=payload_note)&#xA;                resp.raise_for_status()&#xA;                resp_dict = resp.json()&#xA;                print(resp_dict)&#xA;                print(resp_dict[&amp;#39;id&amp;#39;])&#xA;                myuid= resp_dict[&amp;#39;id&amp;#39;]&#xA;            except requests.exceptions.HTTPError as e:&#xA;                print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;            except requests.exceptions.RequestException as e:&#xA;                print(&amp;#34;Network error:&amp;#34;, e)&#xA;&#xA;            url_notes_put = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/notes/&amp;#34;+myuid+&amp;#34;?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;&#xA;            try:&#xA;                resp = requests.put(url_notes_put, json=payload_note_put)&#xA;                resp.raise_for_status()&#xA;                resp_dict = resp.json()&#xA;                print(resp_dict)&#xA;            except requests.exceptions.HTTPError as e:&#xA;                print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;            except requests.exceptions.RequestException as e:&#xA;                print(&amp;#34;Network error:&amp;#34;, e)&#xA;            &#xA;            if my_file.is_file():&#xA;               cmd = &amp;#34;curl -F &amp;#39;data=@&amp;#34;+filename+&amp;#34;&amp;#39; -F &amp;#39;props={\&amp;#34;title\&amp;#34;:\&amp;#34;&amp;#34;+myfilename+&amp;#34;\&amp;#34;}&amp;#39; http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/resources?token=&amp;#34;+token&#xA;               print(&amp;#34;Command&amp;#34;+cmd)&#xA;               resp = os.popen(cmd).read()&#xA;               try:&#xA;                  respj = json.loads(resp)&#xA;                  print(respj[&amp;#39;id&amp;#39;])&#xA;                  myuid_picture= respj[&amp;#39;id&amp;#39;]&#xA;               except:&#xA;                  print(&amp;#39;bad json: &amp;#39;, resp)&#xA;&#xA;               mybody = row[&amp;#39;description&amp;#39;] + &amp;#34;\n  ![&amp;#34; + myfilename + &amp;#34;](:/&amp;#34; + myuid_picture + &amp;#34;)   \n&amp;#34;;&#xA;&#xA;               payload_note_put = {&#xA;                &amp;#34;body&amp;#34;:mybody&#xA;                }&#xA;&#xA;               try:&#xA;                  resp = requests.put(url_notes_put, json=payload_note_put)&#xA;                  resp.raise_for_status()&#xA;                  resp_dict = resp.json()&#xA;                  print(resp_dict)&#xA;               except requests.exceptions.HTTPError as e:&#xA;                  print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;               except requests.exceptions.RequestException as e:&#xA;                  print(&amp;#34;Network error:&amp;#34;, e)&#xA;&#xA;print(nb_metadata)&#xA;print(nb_metadata_import)&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Installation de pip sur Mac OS</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-11-installation-de-pip-sur-mac-os/</link>
      <pubDate>Mon, 11 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-11-installation-de-pip-sur-mac-os/</guid>
      <description>&lt;p&gt;Voici ce que j&amp;rsquo;ai fait pour faire l&amp;rsquo;installation de pip sur Mac OS :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py&#xA;  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current&#xA;                                 Dload  Upload   Total   Spent    Left  Speed&#xA;100 1662k  100 1662k    0     0   560k      0  0:00:02  0:00:02 --:--:-- 560k&#xA;&#xA;$ python3 get-pip.py&#xA;Collecting pip&#xA;  Downloading https://files.pythonhosted.org/packages/d7/41/34dd96bd33958e52cb4da2f1bf0818e396514fd4f4725a79199564cd0c20/pip-19.0.2-py2.py3-none-any.whl (1.4MB)&#xA;    100% |████████████████████████████████| 1.4MB 154kB/s &#xA;Installing collected packages: pip&#xA;  Found existing installation: pip 18.1&#xA;    Uninstalling pip-18.1:&#xA;      Successfully uninstalled pip-18.1&#xA;Successfully installed pip-19.0.2&#xA;&#xA;$ pip install feedparser&#xA;Collecting feedparser&#xA;  Downloading https://files.pythonhosted.org/packages/91/d8/7d37fec71ff7c9dbcdd80d2b48bcdd86d6af502156fc93846fb0102cb2c4/feedparser-5.2.1.tar.bz2 (192kB)&#xA;    100% |████████████████████████████████| 194kB 500kB/s &#xA;Building wheels for collected packages: feedparser&#xA;  Building wheel for feedparser (setup.py) ... done&#xA;  Stored in directory: ....&#xA;Successfully built feedparser&#xA;Installing collected packages: feedparser&#xA;Successfully installed feedparser-5.2.1&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Diaro App : DiaroBackup.xml : How to parse in python ? (Draft n°4)</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-09-diaro-app-diarobackup-xml-how-to-parse-in-python-draft-n4/</link>
      <pubDate>Sat, 09 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-09-diaro-app-diarobackup-xml-how-to-parse-in-python-draft-n4/</guid>
      <description>&lt;p&gt;(See the finale release : &lt;a href=&#34;https://www.cyber-neurones.org/2019/02/diaro-app-pixel-crater-ltd-diarobackup-xml-how-to-migrate-data-to-joplin/&#34;&gt;https://www.cyber-neurones.org/2019/02/diaro-app-pixel-crater-ltd-diarobackup-xml-how-to-migrate-data-to-joplin/&lt;/a&gt; )&lt;/p&gt;&#xA;&lt;p&gt;Je pensais avoir trouvé mon bug &amp;hellip; je pensais que c&amp;rsquo;était l&amp;rsquo;espace avant la variable qui faisait que les valeurs n&amp;rsquo;était pas prise en compte.&lt;/p&gt;&#xA;&lt;p&gt;Avec : &lt;strong&gt;requests.post(url_folders, json=payload)&lt;/strong&gt; on a un . c.a.d. un 20&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;images/capture-decran-2019-02-09-a-21-05-48.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Avec : &lt;strong&gt;requests.post(url_folders, data=json.dumps(payload, separators=(&amp;rsquo;,&amp;rsquo;,&amp;rsquo;:&amp;rsquo;)), headers=headers)&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sachant que : headers = {&amp;lsquo;Content-type&amp;rsquo;: &amp;lsquo;application/json&amp;rsquo;, &amp;lsquo;Accept&amp;rsquo;: &amp;rsquo;text/plain&amp;rsquo;}&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;images/capture-decran-2019-02-09-a-22-09-15-1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Je n&amp;rsquo;ai plus d&amp;rsquo;espace mais les valeurs numériques ne sont pas prise en compte &amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Diaro App : DiaroBackup.xml : How to parse in python ? (Draft n°2)</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-08-diaro-app-diarobackup-xml-how-to-parse-in-python-draft-n2/</link>
      <pubDate>Fri, 08 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-08-diaro-app-diarobackup-xml-how-to-parse-in-python-draft-n2/</guid>
      <description>&lt;p&gt;(See the finale release : &lt;a href=&#34;https://www.cyber-neurones.org/2019/02/diaro-app-pixel-crater-ltd-diarobackup-xml-how-to-migrate-data-to-joplin/&#34;&gt;https://www.cyber-neurones.org/2019/02/diaro-app-pixel-crater-ltd-diarobackup-xml-how-to-migrate-data-to-joplin/&lt;/a&gt; )&lt;/p&gt;&#xA;&lt;p&gt;I have issue with ressources &lt;strong&gt;(link between ressources and notes)&lt;/strong&gt; &amp;hellip;. error 404. The logs in : .config/joplin-desktop/log-clipper.txt&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;....: &amp;#34;Request: PUT /ressources/71dd2cba2af54c4ebb53fb7fd8d0543b/notes/cbbc6076b2ac321ccae1f036a2fe6659?token=....&amp;#34;&#xA;....: &amp;#34;Error: Not Found&#xA;Error: Not Found&#xA;    at Api.route (/Applications/Joplin.app/Contents/Resources/app/lib/services/rest/Api.js:103:41)&#xA;    at execRequest (/Applications/Joplin.app/Contents/Resources/app/lib/ClipperServer.js:147:39)&#xA;    at IncomingMessage.request.on (/Applications/Joplin.app/Contents/Resources/app/lib/ClipperServer.js:185:8)&#xA;    at emitNone (events.js:105:13)&#xA;    at IncomingMessage.emit (events.js:207:7)&#xA;    at endReadableNT (_stream_readable.js:1045:12)&#xA;    at _combinedTickCallback (internal/process/next_tick.js:138:11)&#xA;    at process._tickCallback (internal/process/next_tick.js:180:9)&amp;#34;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;My last code :&lt;/strong&gt;&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#&#xA;# Version 2 &#xA;# for Python 3&#xA;# &#xA;#   ARIAS Frederic&#xA;#   Sorry ... It&amp;#39;s difficult for me the python :)&#xA;#&#xA;&#xA;#from lxml import etree&#xA;import xml.etree.ElementTree as etree&#xA;from time import gmtime, strftime&#xA;import time&#xA;import json&#xA;import requests&#xA;import os&#xA;&#xA;strftime(&amp;#34;%Y-%m-%d %H:%M:%S&amp;#34;, gmtime())&#xA;start = time.time()&#xA;&#xA;#Token&#xA;ip = &amp;#34;127.0.0.1&amp;#34;&#xA;port = &amp;#34;41184&amp;#34;&#xA;token = &amp;#34;ABCD123ABCD123ABCD123ABCD123ABCD123&amp;#34;&#xA;&#xA;url_notes = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/notes?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;url_folders = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/folders?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;url_tags = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/tags?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;url_ressources = (&#xA;    &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/ressources?&amp;#34;&#xA;    &amp;#34;token=&amp;#34;+token&#xA;)&#xA;&#xA;#Init&#xA;Diaro_UID = &amp;#34;12345678901234567801234567890123&amp;#34;&#xA;Lat = {}&#xA;Lng = {}&#xA;UID = {} &#xA;TAGS = {}&#xA;Lat[&amp;#34;&amp;#34;] = &amp;#34;&amp;#34;&#xA;Lng[&amp;#34;&amp;#34;] = &amp;#34;&amp;#34;&#xA;&#xA;payload = {&#xA;    &amp;#34;id&amp;#34;: Diaro_UID,&#xA;    &amp;#34;title&amp;#34;: &amp;#34;Diaro Import&amp;#34;&#xA;}&#xA;&#xA;try:&#xA;    resp = requests.post(url_folders, json=payload)&#xA;    #time.sleep(1)&#xA;    resp.raise_for_status()&#xA;    resp_dict = resp.json()&#xA;    print(resp_dict)&#xA;    print(&amp;#34;My ID&amp;#34;)&#xA;    print(resp_dict[&amp;#39;id&amp;#39;])&#xA;    Diaro_UID_real = resp_dict[&amp;#39;id&amp;#39;]&#xA;    save = str(resp_dict[&amp;#39;id&amp;#39;])&#xA;    UID[Diaro_UID]= save&#xA;except requests.exceptions.HTTPError as e:&#xA;    print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;except requests.exceptions.RequestException as e:&#xA;    print(&amp;#34;Network error:&amp;#34;, e)&#xA;&#xA;print(&amp;#34;Start : Parse Table&amp;#34;)&#xA;tree = etree.parse(&amp;#34;./DiaroBackup.xml&amp;#34;)&#xA;for table in tree.iter(&amp;#39;table&amp;#39;):&#xA;    name = table.attrib.get(&amp;#39;name&amp;#39;)&#xA;    print(name)&#xA;    myorder = 1&#xA;    for r in table.iter(&amp;#39;r&amp;#39;):&#xA;         myuid = &amp;#34;&amp;#34;&#xA;         mytitle = &amp;#34;&amp;#34;&#xA;         mylat = &amp;#34;&amp;#34;&#xA;         mylng = &amp;#34;&amp;#34;&#xA;         mytags = &amp;#34;&amp;#34;&#xA;         mydate = &amp;#34;&amp;#34;&#xA;         mydate_ms = 0;&#xA;         mytext = &amp;#34;&amp;#34;&#xA;         myfilename = &amp;#34;&amp;#34;&#xA;         myfolder_uid = Diaro_UID&#xA;         mylocation_uid = &amp;#34;&amp;#34;&#xA;         myprimary_photo_uid = &amp;#34;&amp;#34;&#xA;         myentry_uid = &amp;#34;&amp;#34;&#xA;         myorder += 1&#xA;         for subelem in r:&#xA;             print(subelem.tag)&#xA;             if (subelem.tag == &amp;#39;uid&amp;#39;):&#xA;                 myuid = subelem.text&#xA;                 print (&amp;#34;myuid&amp;#34;,myuid)&#xA;             if (subelem.tag == &amp;#39;entry_uid&amp;#39;):&#xA;                 myentry_uid = subelem.text&#xA;                 print (&amp;#34;myentry_uid&amp;#34;,myentry_uid)&#xA;             if (subelem.tag == &amp;#39;primary_photo_uid&amp;#39;):&#xA;                 myprimary_photo_uid = subelem.text&#xA;                 print (&amp;#34;myprimary_photo_uid&amp;#34;,myprimary_photo_uid)&#xA;             if (subelem.tag == &amp;#39;folder_uid&amp;#39;):&#xA;                 myfolder_uid = subelem.text&#xA;                 print (&amp;#34;myfolder_uid&amp;#34;,myfolder_uid)&#xA;             if (subelem.tag == &amp;#39;location_uid&amp;#39;):&#xA;                 mylocation_uid = subelem.text&#xA;                 print (&amp;#34;mylocation_uid&amp;#34;,mylocation_uid)&#xA;             if (subelem.tag == &amp;#39;date&amp;#39;):&#xA;                 mydate = subelem.text&#xA;                 mydate_ms = int(mydate)&#xA;                 print (&amp;#34;mydate&amp;#34;,mydate,&amp;#34; in ms&amp;#34;,mydate_ms)&#xA;             if (subelem.tag == &amp;#39;title&amp;#39;):&#xA;                 mytitle = subelem.text&#xA;                 print (&amp;#34;mytitle&amp;#34;,mytitle)&#xA;                 #if type(mytitle) == str:&#xA;                    #mytitle = mytitle.encode(&amp;#39;utf8&amp;#39;)&#xA;             if (subelem.tag == &amp;#39;lat&amp;#39;):&#xA;                 mylat = subelem.text&#xA;                 print (&amp;#34;mylat&amp;#34;,mylat)&#xA;             if (subelem.tag == &amp;#39;lng&amp;#39;):&#xA;                 mylng = subelem.text&#xA;                 print (&amp;#34;mylng&amp;#34;,mylng)&#xA;             if (subelem.tag == &amp;#39;tags&amp;#39;):&#xA;                 mytags = subelem.text&#xA;                 if mytags:&#xA;                    mytags[1:]&#xA;                 print (&amp;#34;mytags&amp;#34;,mytags)&#xA;             if (subelem.tag == &amp;#39;text&amp;#39;):&#xA;                 mytext = subelem.text&#xA;                 print (&amp;#34;mytext&amp;#34;,mytext)&#xA;                 #if type(mytext) == str:&#xA;                       #mytext = mytext.encode(&amp;#39;utf8&amp;#39;)&#xA;             if (subelem.tag == &amp;#39;filename&amp;#39;):&#xA;                 myfilename = subelem.text&#xA;                 print (&amp;#34;myfilename&amp;#34;,myfilename)&#xA;                 &#xA;         if (name == &amp;#39;diaro_folders&amp;#39;):&#xA;            payload_folder = {&#xA;  &amp;#34;id&amp;#34;: myuid,&#xA;  &amp;#34;title&amp;#34;: mytitle,&#xA;  &amp;#34;parent_id&amp;#34;: Diaro_UID_real&#xA;}&#xA;            print(payload_folder)&#xA;            try:&#xA;                resp = requests.post(url_folders, json=payload_folder)&#xA;                #time.sleep(1)&#xA;                resp.raise_for_status()&#xA;                resp_dict = resp.json()&#xA;                print(resp_dict)&#xA;                print(resp_dict[&amp;#39;id&amp;#39;])&#xA;                save = str(resp_dict[&amp;#39;id&amp;#39;]) &#xA;                UID[myuid]= save&#xA;            except requests.exceptions.HTTPError as e:&#xA;                print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;            except requests.exceptions.RequestException as e:&#xA;                print(&amp;#34;Network error:&amp;#34;, e)&#xA;&#xA;         if (name == &amp;#39;diaro_tags&amp;#39;):&#xA;            payload_tags = {&#xA;                &amp;#34;id&amp;#34;: myuid,&#xA;                &amp;#34;title&amp;#34;: mytitle&#xA;            }&#xA;            try:&#xA;                resp = requests.post(url_tags, json=payload_tags)&#xA;                #time.sleep(1)&#xA;                resp.raise_for_status()&#xA;                resp_dict = resp.json()&#xA;                print(resp_dict)&#xA;                print(resp_dict[&amp;#39;id&amp;#39;])&#xA;                UID[myuid]= resp_dict[&amp;#39;id&amp;#39;]&#xA;                TAGS[myuid] = mytitle&#xA;            except requests.exceptions.HTTPError as e:&#xA;                print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;            except requests.exceptions.RequestException as e:&#xA;                print(&amp;#34;Network error:&amp;#34;, e)&#xA;&#xA;         if (name == &amp;#39;diaro_attachments&amp;#39;):&#xA;            payload_ressource = {&#xA;                &amp;#34;id&amp;#34;: myuid&#xA;            }&#xA;            filename = &amp;#34;./media/photo/&amp;#34;+myfilename&#xA;            files = {&amp;#39;document&amp;#39;: open(filename, &amp;#39;rb&amp;#39;)}&#xA;            files2 = {&amp;#39;data&amp;#39;: open(filename, &amp;#39;rb&amp;#39;)}&#xA;            files3 = {&amp;#39;data&amp;#39;: open(filename, &amp;#39;rb&amp;#39;), &amp;#39;props&amp;#39;: payload_ressource}&#xA;            data_ressource = {&#xA;                 &amp;#34;title&amp;#34;: myfilename&#xA;            }&#xA;            multiple_files = [&#xA;                (&amp;#39;data&amp;#39;, (myfilename, open(filename, &amp;#39;rb&amp;#39;))),&#xA;                (&amp;#39;props&amp;#39;, data_ressource)]&#xA;            headers = {&amp;#39;Content-type&amp;#39;: &amp;#39;multipart/form-data&amp;#39;}&#xA;            print(&amp;#34;Push : &amp;#34;+filename);&#xA;            #print os.path.isfile(filename)&#xA;            print(&amp;#34;----------0-----------&amp;#34;)&#xA;            #try:&#xA;               #resp = requests.post(url_ressources, files=filename, json=payload_ressource)&#xA;               #resp = requests.post(url_ressources, files=files, json=payload_ressource, headers=headers) &#xA;               #resp = requests.post(url_ressources, files=files2, headers=headers)&#xA;               #resp = requests.post(url_ressources, files=files2, headers=headers)&#xA;               #resp = requests.post(url_ressources,files = {&amp;#39;data&amp;#39; : (myfilename, open(filename, &amp;#39;rb&amp;#39;), &amp;#39;image/jpg&amp;#39;)}, data = {&amp;#39;id&amp;#39; : myuid}, headers=headers)&#xA;               #resp = requests.post(url_ressources,files = files2, data= data_ressource, headers=headers)&#xA;               #resp = requests.post(url_ressources,files = multiple_files, headers=headers)&#xA;               #resp = requests.post(url_ressources,files = multiple_files)&#xA;               #resp.text&#xA;               #time.sleep(1)&#xA;               #resp.raise_for_status()&#xA;               #if (resp.status_code == requests.codes.ok):&#xA;               #    resp_dict = resp.json()&#xA;               #    print(resp_dict)&#xA;               #    print(resp_dict[&amp;#39;id&amp;#39;])&#xA;               #    UID[myuid]= resp_dict[&amp;#39;id&amp;#39;]&#xA;            #except requests.exceptions.HTTPError as e:&#xA;               #print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;               #UID[myuid]=&amp;#34;&amp;#34;&#xA;               #print(&amp;#34;----------1-----------&amp;#34;)&#xA;            #except requests.exceptions.RequestException as e:&#xA;               #print(&amp;#34;Network error:&amp;#34;, e)&#xA;               #UID[myuid]=&amp;#34;&amp;#34;&#xA;               #print(&amp;#34;----------2-----------&amp;#34;)&#xA;&#xA;            cmd = &amp;#34;curl -F &amp;#39;data=@&amp;#34;+filename+&amp;#34;&amp;#39; -F &amp;#39;props={\&amp;#34;title\&amp;#34;:\&amp;#34;&amp;#34;+myfilename+&amp;#34;\&amp;#34;}&amp;#39; http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/resources?token=&amp;#34;+token&#xA;            resp = os.popen(cmd).read()&#xA;            respj = json.loads(resp)&#xA;            #resp_dict = respj.json() &#xA;            print(respj[&amp;#39;id&amp;#39;])&#xA;            UID[myuid]= respj[&amp;#39;id&amp;#39;]&#xA;&#xA;            print(&amp;#34;Link : &amp;#34;,myuid,&amp;#34; =&amp;gt; &amp;#34;,myentry_uid,&amp;#34; // &amp;#34;,UID[myuid]+&amp;#34; =&amp;gt; &amp;#34;,UID[myentry_uid])&#xA;            time.sleep(1)&#xA;&#xA;            cmd = &amp;#34;curl -X PUT http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/ressources/&amp;#34;+UID[myuid]+&amp;#34;/notes/&amp;#34;+UID[myentry_uid]+&amp;#34;?token=&amp;#34;+token&#xA;            resp = os.popen(cmd).read()&#xA;            print (resp)&#xA;            #url_link = (&#xA;            #   &amp;#34;http://&amp;#34;+ip+&amp;#34;:&amp;#34;+port+&amp;#34;/ressources/&amp;#34;+UID[myuid]+&amp;#34;/notes/&amp;#34;+UID[myentry_uid]+&amp;#34;?&amp;#34;&#xA;            #   &amp;#34;token=&amp;#34;+token&#xA;            #   )&#xA;            #try:&#xA;            #  resp = requests.post(url_link)&#xA;            #   #time.sleep(1)&#xA;            #   resp.raise_for_status()&#xA;            #   resp_dict = resp.json()&#xA;            #   print(resp_dict)&#xA;            #   print(resp_dict[&amp;#39;id&amp;#39;])&#xA;            #   UID[myuid]= resp_dict[&amp;#39;id&amp;#39;]&#xA;            #except requests.exceptions.HTTPError as e:&#xA;            #   print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;            #except requests.exceptions.RequestException as e:&#xA;            #   print(&amp;#34;Network error:&amp;#34;, e)&#xA;&#xA;         if (name == &amp;#39;diaro_locations&amp;#39;):&#xA;              Lat[myuid] = mylat&#xA;              Lng[myuid] = mylng&#xA;&#xA;         if (name == &amp;#39;diaro_entries&amp;#39;):&#xA;            if not mytext:&#xA;                  mytext = &amp;#34;&amp;#34;&#xA;            if not myfolder_uid:&#xA;                  myfolder_uid = Diaro_UID&#xA;            if not mytags:&#xA;                  mytags = &amp;#34;&amp;#34;&#xA;            if not mylocation_uid:&#xA;                  mylocation_uid = &amp;#34;&amp;#34;&#xA;            mytext = mytext.replace(&amp;#34;&amp;#39;&amp;#34;, &amp;#34;&amp;#34;)&#xA;            mytitle = mytitle.replace(&amp;#34;&amp;#39;&amp;#34;, &amp;#34;&amp;#34;)&#xA;            mytext = mytext.strip(&amp;#34;\&amp;#39;&amp;#34;)&#xA;            mytitle = mytitle.strip(&amp;#34;\&amp;#39;&amp;#34;)&#xA;            mytext = mytext.strip(&amp;#39;(&amp;#39;)&#xA;            mytitle = mytitle.strip(&amp;#39;(&amp;#39;)&#xA;            listtags = mytags.split(&amp;#34;,&amp;#34;)&#xA;            new_tagslist = &amp;#34;&amp;#34;;&#xA;            for uid_tags in listtags:&#xA;                 if (len(uid_tags) &amp;gt; 2):&#xA;                        if uid_tags in UID:&#xA;                             new_tagslist = new_tagslist + TAGS[uid_tags] + &amp;#34;,&amp;#34;;&#xA;            print (&amp;#34;TAGS&amp;#34;,mytags,&amp;#34;==&amp;gt;&amp;#34;,new_tagslist);&#xA;            payload_note = {&#xA;                &amp;#34;id&amp;#34;: myuid,&#xA;                &amp;#34;latitude&amp;#34;: Lat[mylocation_uid],&#xA;                &amp;#34;longitude&amp;#34;: Lng[mylocation_uid],&#xA;                &amp;#34;tags&amp;#34;: new_tagslist,&#xA;                &amp;#34;parent_id&amp;#34;: UID[myfolder_uid],&#xA;                &amp;#34;title&amp;#34;: mytitle,&#xA;                #&amp;#34;created_time&amp;#34;: mydate_ms,&#xA;                &amp;#34;user_created_time&amp;#34;: mydate_ms,&#xA;                &amp;#34;user_updated_time&amp;#34;: mydate_ms,&#xA;                &amp;#34;author&amp;#34;: &amp;#34;Diaro&amp;#34;,&#xA;                &amp;#34;body&amp;#34;: mytext &#xA;            }&#xA;            try:&#xA;                resp = requests.post(url_notes, json=payload_note)&#xA;                #time.sleep(1)&#xA;                resp.raise_for_status()&#xA;                resp_dict = resp.json()&#xA;                print(resp_dict)&#xA;                print(resp_dict[&amp;#39;id&amp;#39;])&#xA;                UID[myuid]= resp_dict[&amp;#39;id&amp;#39;]&#xA;            except requests.exceptions.HTTPError as e:&#xA;                print(&amp;#34;Bad HTTP status code:&amp;#34;, e)&#xA;            except requests.exceptions.RequestException as e:&#xA;                print(&amp;#34;Network error:&amp;#34;, e)&#xA;&#xA;print(&amp;#34;End : Parse Table&amp;#34;)&#xA;&#xA;strftime(&amp;#34;%Y-%m-%d %H:%M:%S&amp;#34;, gmtime())&#xA;done = time.time()&#xA;elapsed = done - start&#xA;print(elapsed)&#xA;&#xA;# END : Ouf ...&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Mac OS : ImportError: No module named requests</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-06-mac-os-importerror-no-module-named-requests/</link>
      <pubDate>Wed, 06 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-06-mac-os-importerror-no-module-named-requests/</guid>
      <description>&lt;p&gt;J&amp;rsquo;ai voulu suivre la procédure avec brew, pip, &amp;hellip;. mais sans succès avec la version 2.7.2&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ python --version&#xA;Python 2.7.2&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;J&amp;rsquo;avais des erreurs du type :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ brew reinstall python....xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun Error: An exception occurred within a child process:   CompilerSelectionError: python cannot be built with any available compilers. Install GNU&amp;#39;s GCC   brew install gcc$ python -m pip install --user requests /Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python: No module named pip$ sudo easy_install pip Searching for pip Reading http://pypi.python.org/simple/pip/ Couldn&amp;#39;t find index page for &amp;#39;pip&amp;#39; (maybe misspelled?) Scanning index of all packages (this may take a while) Reading http://pypi.python.org/simple/ No local packages or download links found for pip Best match: None Traceback (most recent call last):   File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/bin/easy_install&amp;#34;, line 8, in &amp;lt;module&amp;gt;     load_entry_point(&amp;#39;setuptools==0.6c11&amp;#39;, &amp;#39;console_scripts&amp;#39;, &amp;#39;easy_install&amp;#39;)()   File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/setuptools/command/easy_install.py&amp;#34;, line 1712, in main        File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/setuptools/command/easy_install.py&amp;#34;, line 1700, in with_ei_usage        File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/setuptools/command/easy_install.py&amp;#34;, line 1716, in &amp;lt;lambda&amp;gt;        File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/core.py&amp;#34;, line 152, in setup     dist.run_commands()   File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py&amp;#34;, line 953, in run_commands     self.run_command(cmd)   File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/dist.py&amp;#34;, line 972, in run_command     cmd_obj.run()   File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/setuptools/command/easy_install.py&amp;#34;, line 211, in run        File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/setuptools/command/easy_install.py&amp;#34;, line 434, in easy_install        File &amp;#34;/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg/setuptools/package_index.py&amp;#34;, line 475, in fetch_distribution AttributeError: &amp;#39;NoneType&amp;#39; object has no attribute &amp;#39;clone&amp;#39;  &lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;J&amp;rsquo;ai donc changé de fusil d&amp;rsquo;épaule :&lt;/p&gt;</description>
    </item>
    <item>
      <title>Diaro App : DiaroBackup.xml : How to parse in python ? (Draft n°1)</title>
      <link>https://move.cyber-neurones.org/post/2019/02/2019-02-05-diaro-app-diarobackup-xml-how-to-parse-in-python-draft-n1/</link>
      <pubDate>Tue, 05 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2019/02/2019-02-05-diaro-app-diarobackup-xml-how-to-parse-in-python-draft-n1/</guid>
      <description>&lt;p&gt;(See the finale release : &lt;a href=&#34;https://www.cyber-neurones.org/2019/02/diaro-app-pixel-crater-ltd-diarobackup-xml-how-to-migrate-data-to-joplin/&#34;&gt;https://www.cyber-neurones.org/2019/02/diaro-app-pixel-crater-ltd-diarobackup-xml-how-to-migrate-data-to-joplin/&lt;/a&gt; )&lt;/p&gt;&#xA;&lt;p&gt;Step 1: Add in first ligne : &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; before &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; in file &lt;strong&gt;DiaroBackup.xml&lt;/strong&gt; &amp;hellip; it&amp;rsquo;s mandatory !&lt;/p&gt;&#xA;&lt;p&gt;I use REST API to insert in JOPLIN : &lt;a href=&#34;https://joplin.cozic.net/api/&#34;&gt;https://joplin.cozic.net/api/&lt;/a&gt; , it&amp;rsquo;s good documentation.&lt;/p&gt;&#xA;&lt;p&gt;Here my first release in Python to import data from Diaro App Backup to Joplin API :&lt;/p&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#&#xA;# Version 1  &#xA;#  &#xA;#   ARIAS Frederic&#xA;#   Sorry ... It&amp;#39;s difficult for me the python :)&#xA;&#xA;from urllib2 import unquote&#xA;from lxml import etree&#xA;import os&#xA;from time import gmtime, strftime&#xA;import time&#xA;&#xA;strftime(&amp;#34;%Y-%m-%d %H:%M:%S&amp;#34;, gmtime())&#xA;start = time.time()&#xA;&#xA;print(&amp;#34;Start : Parse Table&amp;#34;)&#xA;tree = etree.parse(&amp;#34;./DiaroBackup.xml&amp;#34;)&#xA;for table in tree.xpath(&amp;#34;/data/table&amp;#34;):&#xA;    print(table.get(&amp;#34;name&amp;#34;))&#xA;print(&amp;#34;End : Parse Table&amp;#34;)&#xA;&#xA;#Token&#xA;ip = &amp;#34;127.0.0.1&amp;#34;&#xA;port = &amp;#34;41184&amp;#34;&#xA;#token = &amp;#34;ABCD123ABCD123ABCD123ABCD123ABCD123&amp;#34;&#xA;token = &amp;#34;blablabla&amp;#34;&#xA;cmd = &amp;#39;curl http://&amp;#39;+ip+&amp;#39;:&amp;#39;+port+&amp;#39;/notes?token=&amp;#39;+token&#xA;print cmd&#xA;os.system(cmd)&#xA;&#xA;#Init&#xA;Diaro_UID = &amp;#34;12345678901234567801234567890123&amp;#34;&#xA;Lat = {}&#xA;Lng = {}&#xA;Lat[&amp;#34;&amp;#34;] = &amp;#34;&amp;#34;&#xA;Lng[&amp;#34;&amp;#34;] = &amp;#34;&amp;#34;&#xA;cmd = &amp;#39;curl --data \&amp;#39;{ &amp;#34;id&amp;#34;: &amp;#34;&amp;#39;+Diaro_UID+&amp;#39;&amp;#34;, &amp;#34;title&amp;#34;: &amp;#34;Diaro Import&amp;#34;}\&amp;#39; http://&amp;#39;+ip+&amp;#39;:&amp;#39;+port+&amp;#39;/folders?token=&amp;#39;+token&#xA;print cmd&#xA;os.system(cmd)&#xA;&#xA;print(&amp;#34;Start : Parse Table&amp;#34;)&#xA;tree = etree.parse(&amp;#34;./DiaroBackup.xml&amp;#34;)&#xA;for table in tree.iter(&amp;#39;table&amp;#39;):&#xA;    name = table.attrib.get(&amp;#39;name&amp;#39;)&#xA;    print name&#xA;    myorder = 1&#xA;    for r in table.iter(&amp;#39;r&amp;#39;):&#xA;         myuid = &amp;#34;&amp;#34;&#xA;         mytitle = &amp;#34;&amp;#34;&#xA;         mylat = &amp;#34;&amp;#34;&#xA;         mylng = &amp;#34;&amp;#34;&#xA;         mytags = &amp;#34;&amp;#34;&#xA;         mydate = &amp;#34;&amp;#34;&#xA;         mytext = &amp;#34;&amp;#34;&#xA;         myfilename = &amp;#34;&amp;#34;&#xA;         myfolder_uid = Diaro_UID&#xA;         mylocation_uid = &amp;#34;&amp;#34;&#xA;         myprimary_photo_uid = &amp;#34;&amp;#34;&#xA;         myentry_uid = &amp;#34;&amp;#34;&#xA;         myorder += 1&#xA;         for subelem in r:&#xA;&#x9;     print(subelem.tag)&#xA;             if (subelem.tag == &amp;#39;uid&amp;#39;):&#xA;                 myuid = subelem.text&#xA;              &#x9; print (&amp;#34;myuid&amp;#34;,myuid)&#xA;             if (subelem.tag == &amp;#39;entry_uid&amp;#39;):&#xA;                 myentry_uid = subelem.text&#xA;                 print (&amp;#34;myentry_uid&amp;#34;,myentry_uid)&#xA;             if (subelem.tag == &amp;#39;primary_photo_uid&amp;#39;):&#xA;                 myprimary_photo_uid = subelem.text&#xA;                 print (&amp;#34;myprimary_photo_uid&amp;#34;,myprimary_photo_uid)&#xA;             if (subelem.tag == &amp;#39;folder_uid&amp;#39;):&#xA;                 myfolder_uid = subelem.text&#xA;                 print (&amp;#34;myfolder_uid&amp;#34;,myfolder_uid)&#xA;             if (subelem.tag == &amp;#39;location_uid&amp;#39;):&#xA;                 mylocation_uid = subelem.text&#xA;                 print (&amp;#34;mylocation_uid&amp;#34;,mylocation_uid)&#xA;             if (subelem.tag == &amp;#39;date&amp;#39;):&#xA;                 mydate = subelem.text&#xA;                 print (&amp;#34;mydate&amp;#34;,mydate)&#xA;             if (subelem.tag == &amp;#39;title&amp;#39;):&#xA;                 mytitle = subelem.text&#xA;                 print (&amp;#34;mytitle&amp;#34;,mytitle)&#xA;&#x9;&#x9; print type(mytitle)&#xA;                 if type(mytitle) == unicode:&#xA;&#x9;&#x9;&#x9;mytitle = mytitle.encode(&amp;#39;utf8&amp;#39;)&#xA;             if (subelem.tag == &amp;#39;lat&amp;#39;):&#xA;                 mylat = subelem.text&#xA;                 print (&amp;#34;mylat&amp;#34;,mylat)&#xA;             if (subelem.tag == &amp;#39;lng&amp;#39;):&#xA;                 mylng = subelem.text&#xA;                 print (&amp;#34;mylng&amp;#34;,mylng)&#xA;             if (subelem.tag == &amp;#39;tags&amp;#39;):&#xA;                 mytags = subelem.text&#xA;                 if mytags:&#xA;                    mytags[1:]&#xA;                 print (&amp;#34;mytags&amp;#34;,mytags)&#xA;             if (subelem.tag == &amp;#39;text&amp;#39;):&#xA;                 mytext = subelem.text&#xA;                 print (&amp;#34;mytext&amp;#34;,mytext)&#xA;                 if type(mytext) == unicode:&#xA;                        mytext = mytext.encode(&amp;#39;utf8&amp;#39;)&#xA;             if (subelem.tag == &amp;#39;filename&amp;#39;):&#xA;                 myfilename = subelem.text&#xA;                 print (&amp;#34;myfilename&amp;#34;,myfilename)&#xA;         if (name == &amp;#39;diaro_folders&amp;#39;):&#xA;              cmd = &amp;#39;curl --data \&amp;#39;{ &amp;#34;id&amp;#34;: &amp;#34;&amp;#39;+myuid+&amp;#39;&amp;#34;, &amp;#34;title&amp;#34;: &amp;#34;&amp;#39;+mytitle+&amp;#39;&amp;#34;, &amp;#34;parent_id&amp;#34;: &amp;#34;&amp;#39;+Diaro_UID+&amp;#39;&amp;#34;}\&amp;#39; http://&amp;#39;+ip+&amp;#39;:&amp;#39;+port+&amp;#39;/folders?token=&amp;#39;+token&#xA;              print cmd&#xA;              os.system(cmd)&#xA;         if (name == &amp;#39;diaro_tags&amp;#39;):&#xA;              cmd = &amp;#39;curl --data \&amp;#39;{ &amp;#34;id&amp;#34;: &amp;#34;&amp;#39;+myuid+&amp;#39;&amp;#34;, &amp;#34;title&amp;#34;: &amp;#34;&amp;#39;+mytitle+&amp;#39;&amp;#34;}\&amp;#39; http://&amp;#39;+ip+&amp;#39;:&amp;#39;+port+&amp;#39;/tags?token=&amp;#39;+token&#xA;              print cmd&#xA;              os.system(cmd)&#xA;         if (name == &amp;#39;diaro_attachments&amp;#39;):&#xA;              cmd = &amp;#39;curl -F \&amp;#39;data=@media/photo/&amp;#39;+myfilename+&amp;#39;\&amp;#39;  -F \&amp;#39;props={&amp;#34;id&amp;#34;:&amp;#34;&amp;#39;+myuid+&amp;#39;&amp;#34;}\&amp;#39; http://&amp;#39;+ip+&amp;#39;:&amp;#39;+port+&amp;#39;/resources?token=&amp;#39;+token&#xA;              print cmd&#xA;              os.system(cmd)&#xA;              cmd = &amp;#39;curl -X PUT http://&amp;#39;+ip+&amp;#39;:&amp;#39;+port+&amp;#39;/resources/&amp;#39;+myuid+&amp;#39;/notes/&amp;#39;+myentry_uid+&amp;#39;?token=&amp;#39;+token&#xA;              print cmd&#xA;              os.system(cmd)&#xA;         if (name == &amp;#39;diaro_locations&amp;#39;):&#xA;              Lat[myuid] = mylat&#xA;              Lng[myuid] = mylng&#xA;         if (name == &amp;#39;diaro_entries&amp;#39;):&#xA;             if not mytext:&#xA;                  mytext = &amp;#34;&amp;#34;&#xA;             if not myfolder_uid:&#xA;                  myfolder_uid = Diaro_UID&#xA;             if not mytags:&#xA;                  mytags = &amp;#34;&amp;#34;&#xA;             if not mylocation_uid:&#xA;                  mylocation_uid = &amp;#34;&amp;#34;&#xA;             mytext = mytext.replace(&amp;#34;&amp;#39;&amp;#34;, &amp;#34;&amp;#34;)&#xA;             mytitle = mytitle.replace(&amp;#34;&amp;#39;&amp;#34;, &amp;#34;&amp;#34;)&#xA;             mytext = mytext.strip(&amp;#34;\&amp;#39;&amp;#34;)&#xA;             mytitle = mytitle.strip(&amp;#34;\&amp;#39;&amp;#34;)&#xA;             mytext = mytext.strip(&amp;#39;(&amp;#39;)&#xA;             mytitle = mytitle.strip(&amp;#39;(&amp;#39;)&#xA;             print type(mytext)&#xA;             cmd = &amp;#39;curl --data \&amp;#39;{&amp;#34;latitude&amp;#34;:&amp;#34;&amp;#39;+Lat[mylocation_uid]+&amp;#39;&amp;#34;,&amp;#34;longitude&amp;#34;:&amp;#34;&amp;#39;+Lng[mylocation_uid]+&amp;#39;&amp;#34;,&amp;#34;tags&amp;#34;:&amp;#34;&amp;#39;+mytags+&amp;#39;&amp;#34;,&amp;#34;parent_id&amp;#34;:&amp;#34;&amp;#39;+myfolder_uid+&amp;#39;&amp;#34;,&amp;#34;id&amp;#34;:&amp;#34;&amp;#39;+myuid+&amp;#39;&amp;#34;,&amp;#34;title&amp;#34;:&amp;#34;&amp;#39;+mytitle+&amp;#39;&amp;#34;, &amp;#34;created_time&amp;#34;: &amp;#34;&amp;#39;+mydate+&amp;#39;&amp;#34;, &amp;#34;body&amp;#34;: &amp;#34;&amp;#39;+mytext+&amp;#39;&amp;#34;}\&amp;#39; http://&amp;#39;+ip+&amp;#39;:&amp;#39;+port+&amp;#39;/notes?token=&amp;#39;+token&#xA;             print cmd&#xA;             os.system(cmd)&#xA;print(&amp;#34;End : Parse Table&amp;#34;)&#xA;&#xA;strftime(&amp;#34;%Y-%m-%d %H:%M:%S&amp;#34;, gmtime())&#xA;done = time.time()&#xA;elapsed = done - start&#xA;print(elapsed)&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;But I don&amp;rsquo;t understand the API, I can force the id ( for exemple : &lt;strong&gt;12345678901234567801234567890123 )&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python &amp; GRAPH : Pour l&#39;instant c&#39;est la galère ...</title>
      <link>https://move.cyber-neurones.org/post/2018/10/2018-10-21-python-graph-pour-linstant-cest-la-galere/</link>
      <pubDate>Sun, 21 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2018/10/2018-10-21-python-graph-pour-linstant-cest-la-galere/</guid>
      <description>&lt;p&gt;J&amp;rsquo;ai essayé :&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;neo4j&lt;/strong&gt; ( &lt;a href=&#34;https://neo4j.com/top-ten-reasons/&#34;&gt;https://neo4j.com/top-ten-reasons/&lt;/a&gt; )  &amp;amp; &lt;strong&gt;python&lt;/strong&gt; :&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Avec : &lt;a href=&#34;https://py2neo.org/v4/&#34;&gt;https://py2neo.org/v4/&lt;/a&gt; : pyneo.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;networkx&lt;/strong&gt; ( &lt;a href=&#34;https://networkx.github.io/documentation/stable/index.html&#34;&gt;https://networkx.github.io/documentation/stable/index.html&lt;/a&gt; ) &amp;amp; python .&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;A noter qu&amp;rsquo;il est possible de mettre neo4j sur un Raspberry : &lt;a href=&#34;https://gist.github.com/widged/8329039&#34;&gt;https://gist.github.com/widged/8329039&lt;/a&gt; . Il me faut faire le test &amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Je voulais tester le concept de Graph ( Node &amp;hellip;.) sur ma base d&amp;rsquo;email &amp;hellip; mais pour l&amp;rsquo;instant c&amp;rsquo;est un échec.&lt;/p&gt;&#xA;&lt;p&gt;Misère.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installation de Jupyter ( Anaconda ) sous Mac</title>
      <link>https://move.cyber-neurones.org/post/2017/12/2017-12-12-installation-de-jupyter-anaconda-sous-mac/</link>
      <pubDate>Tue, 12 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://move.cyber-neurones.org/post/2017/12/2017-12-12-installation-de-jupyter-anaconda-sous-mac/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Jupyter&lt;/strong&gt;, c&amp;rsquo;est programmation et rédaction sur une même page. C&amp;rsquo;est vraiment très bien !&lt;/p&gt;&#xA;&lt;p&gt;La documentation officielle : &lt;a href=&#34;http://jupyter.readthedocs.io/en/latest/install.html&#34;&gt;http://jupyter.readthedocs.io/en/latest/install.html&lt;/a&gt; .&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Mon OSX&lt;/strong&gt; : Version 10.13.2 (17C88). ( A noter : Le MacBook est de mi-2012 et on est en 2017 &amp;hellip; bonne espérance de vie. Pour rappel, la vrai date d&amp;rsquo;utilisation est dans Logiciel -&amp;gt; Installation )&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.cyber-neurones.org/wp-content/uploads/2017/12/capture-decran-2017-12-12-a-14-00-43.png&#34;&gt;&lt;img src=&#34;images/capture-decran-2017-12-12-a-14-00-43.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Il est possible de faire l&amp;rsquo;Etape n°1 ou l&amp;rsquo;Etape n°1 bis (avec Anaconda).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;L&amp;rsquo;étape n°1&lt;/strong&gt; : Installation de Python :&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
