Maven ne fonctionne plus à cause de ssl

Salut à tous,   Aujourd’hui, j’ai voulu joué avec spring, et créer une petite application avec springboot, impossible de téléchargé le pom parent, rien ne fonctionnais ! Après avoir pas mal tatoné, je me suis rendu compte que c’était ssl qui était complètement cassé (peut-être à cause d’une mise à jour foireuse ?).   En tout, avec cette petite commande magique (sous ubuntu / debian), j’ai pu tout réparer en clin d’oeil : sudo apt-get install -y ca-certificates-java && sudo update-ca-certificates -f  ...

Read More

Mettre à jour la documentation développeur Ubuntu UI toolkit

Bonjour, aujourd’hui je vais vous présenter un petit tuto qui vous montre la marche à suivre pour contribuer à la documentation ubuntu touch. En effet, un des gros problèmes avec ubuntu ui toolkit, c’est que la doc est encore loin d’être à jour. Donc si vous suivez l’actualité et que vous voulez donner un coup de main, n’hésitez pas à contribuer ! Premièrement, il vous faudra un compte sur le launchpad Ubuntu UI toolkit et configurer votre clés ssh (je vous laisse allez sur votre profile et suivre les instructions) Dans un second temps, il faut savoir que launchpad utilise bazar comme gestionaire de version (C’est très semblable à git). Il faut cloner la branch staging (qui est la branche des modifications en cours) : bzr branch lp:ubuntu-ui-toolkit/staging Dans un troisième temps, nous allons modifier le fichier et créer notre branche sur bazar. Pour cela, il faudra ouvrir le projet avec un qtCreator (ou même un simple editeur texte). Dans mon cas, j’ai voulu modifier la documentation du composant Popover afin qu’il utilise la dernière version du composant ListItem (l’ancien étant deprecatied car non performant). J’ai donc ouvert le fichier « staging/src/Ubuntu/Components/Popups/1.3/Popover.qml » pour y modifier l’exemple de la documentation. En faisant un bzr status  vous pourrez voir la liste des fichiers modifier et ajouter le votre avec bzr add <chemin-vers-le-fichier> . il ne vous reste à commiter les changements : bzr commit -m "<commentaire>" , et les publiers sur votre branche bzr push lp:~/ubuntu-ui-toolkit/<nom-de-la-branche> . Quatrièmement, il faudra faire votre pull request à la team ubuntu pour que les changements soit accepté ! Il faudra vous rendre sur la page du  launchpad Ubuntu UI toolkit (https://code.launchpad.net/~z-admin-angels-gmail-com/ubuntu-ui-toolkit/<nom-de-votre-brance>)  et cliquez sur « Propose for merging ». Quand à la branche, il faudra choisir « other » et mettre  » lp:ubuntu-ui-toolkit/staging  » afin de bien spécifier la branche staging. Et voila,  une fois que vous aurez saisis le formulaire, votre contribution seras soumis à validation...

Read More

Installer openCV 2.4.12 pour ubuntu et Qt5

Bonjour à tous,   après avoir pas mal galérer à installer openCV 2.4.12 sur ubuntu et le faire fonctionner avec ubuntu, j’ai décidé de partager mon retour d’expérience.   Installer les dépendances :   Shell # install dependencies sudo apt-get update sudo apt-get install -y build-essential g++ sudo apt-get install -y cmake git sudo apt-get install -y libgtk2.0-dev sudo apt-get install -y pkg-config sudo apt-get install -y python-numpy python-dev sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install -y libjpeg-dev libpng-dev libtiff-dev libjasper-dev sudo apt-get -qq install libopencv-dev build-essential checkinstall cmake pkg-config yasm libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils 1234567891011 # install dependenciessudo apt-get updatesudo apt-get install -y build-essential g++sudo apt-get install -y cmake gitsudo apt-get install -y libgtk2.0-devsudo apt-get install -y pkg-configsudo apt-get install -y python-numpy python-devsudo apt-get install -y libavcodec-dev libavformat-dev libswscale-devsudo apt-get install -y libjpeg-dev libpng-dev libtiff-dev libjasper-dev sudo apt-get -qq install libopencv-dev build-essential checkinstall cmake pkg-config yasm libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils   Ensuite récupérer openCV depuis git Shell mkdir -p ~/dev/ cd ~/dev git clone https://github.com/Itseez/opencv.git 123 mkdir -p ~/dev/cd ~/devgit clone https://github.com/Itseez/opencv.git   Maintenant compilons le tout   Shell cd opencv-2.4.12 mkdir release cd release # compile and install cmake -G "Unix Makefiles" -D CMAKE_CXX_COMPILER=/usr/bin/g++ CMAKE_C_COMPILER=/usr/bin/gcc -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D BUILD_FAT_JAVA_LIB=ON -D INSTALL_TO_MANGLED_PATHS=ON -D INSTALL_CREATE_DISTRIB=ON -D INSTALL_TESTS=ON -D ENABLE_FAST_MATH=ON -D WITH_IMAGEIO=ON -D BUILD_SHARED_LIBS=OFF -D WITH_GSTREAMER=ON .. make all -j4 # 4 cores sudo make install 12345678 cd opencv-2.4.12mkdir releasecd release # compile and installcmake -G "Unix Makefiles" -D CMAKE_CXX_COMPILER=/usr/bin/g++ CMAKE_C_COMPILER=/usr/bin/gcc -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D BUILD_FAT_JAVA_LIB=ON -D INSTALL_TO_MANGLED_PATHS=ON -D INSTALL_CREATE_DISTRIB=ON -D INSTALL_TESTS=ON -D ENABLE_FAST_MATH=ON -D WITH_IMAGEIO=ON -D BUILD_SHARED_LIBS=OFF -D WITH_GSTREAMER=ON ..make all -j4 # 4 coressudo make install   dans le dossier /etc/ld.so.conf.d/ créer un fichier « opencv.conf » Et coller ceci dedans : /usr/local/lib Maintenant executer la commande sudo ldconfig   Maintenant ajoutons les dépendances dans notre projet QT (dans le fichier .pro )   Shell INCLUDEPATH += . INCLUDEPATH += /usr/local/include INCLUDEPATH += /usr/local/include/opencv INCLUDEPATH += /usr/local/include/opencv2 INCLUDEPATH += /usr/local/include/opencv2/core INCLUDEPATH += /usr/local/include/opencv2/highgui INCLUDEPATH += /usr/local/include/opencv2/imgproc...

Read More

créer une application spring-boot déployable en war (tomcat)

Bonjour à tous,   après m’être cassé les dents pas mal de temps sur ce problème, j’ai ENFIN trouvé la solution. Et évidement, c’était tout bête.   pour créer une appllication springboot que l’on peut déployer dans un tomcat   il faut que votre classe application hérite de SpringBootServletInitializer et override la méthode configure   comme ceci : Java @SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } } 12345678910111213 @SpringBootApplicationpublic class Application extends SpringBootServletInitializer {     @Override    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {        return application.sources(Application.class);    }     public static void main(String[] args) throws Exception {        SpringApplication.run(Application.class, args);    } }   et votre pom.xml doit ressembler à ceci : XHTML <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>huseyinbabal.net</groupId> <artifactId>spring-mongodb-data-rest</artifactId> <version>0.1.0</version> <packaging>war</packaging> <properties> <java.version>1.7</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.2.7.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>1.1.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <pluginManagement> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <url>http://localhost:8080/manager/text</url> <server>TomcatServer</server> <path>/morgan</path> <username>openfoodfacts</username> <password>password</password> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </pluginManagement> <finalName>restWS</finalName> </build> </project> 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>  <groupId>huseyinbabal.net</groupId> <artifactId>spring-mongodb-data-rest</artifactId> <version>0.1.0</version> <packaging>war</packaging>  <properties> <java.version>1.7</java.version> </properties>  <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.2.7.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>1.1.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>   <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>   <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-tomcat</artifactId>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency> </dependencies>  <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins>  <pluginManagement> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <url>http://localhost:8080/manager/text</url> <server>TomcatServer</server> <path>/morgan</path> <username>openfoodfacts</username> <password>password</password> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.3</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </pluginManagement> <finalName>restWS</finalName> </build> </project>   il doit générer un fichier war grâce à la propriété : XHTML <packaging>war</packaging> 1 <packaging>war</packaging> utiliser la dépendence : XHTML <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> 12345   <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-tomcat</artifactId>            <scope>provided</scope>        </dependency> et normalement le problème devrais etre...

Read More

Savoir si un utilisateur à fini de télécharger un fichier

Savoir si un utilisateur à fini de télécharger un fichier

Bonjour à tous, Récemment j’ai eu la problématique d’effectuer une action uniquement dans l’utilisateur à fini de télécharger un fichier. Pour résoudre ce problème j’ai du utiliser FileChannel qui permet de savoir exactement où l’on en est dans la lecture du fichier. La solution est tellement simple qu’elle en est élégante : il suffit de overrider la méthode close de FileInputStream Java final FileInputStream fileInputStream = new FileInputStream(zipFile){ @Override public void close() throws IOException { FileChannel fc = this.getChannel(); if (fc.position() == fc.size()) { LOGGER.warn("#### download finished ###"); } else { LOGGER.warn("#### File is not finished to download ###"); } super.close(); } }; 1234567891011121314 final FileInputStream fileInputStream = new FileInputStream(zipFile){ @Override public void close() throws IOException { FileChannel fc = this.getChannel();  if (fc.position() ==  fc.size()) { LOGGER.warn("#### download finished ###");  } else { LOGGER.warn("#### File is not finished to download ###"); } super.close(); }}; Enfaîte, la méthode close est appelé quand la connexion est close. Si la position du fileChannel est égale à la taille totale, cela veux dire que le téléchargement à été terminé (tout le fichier à été lu). Hors si la position n’est pas égale à la taille, c’est que la connexion à été close par le client avant la fin du téléchargement (téléchargement annulé par l’utilisateur)....

Read More

Création d’une application pour ubuntu touch – jour 3

Création d’une application pour ubuntu touch – jour 3

Utilisation du toolkit de démonstration d’ubuntu touch Bonjour à tous. Après avoir passez les deux étapes préliminaires, nous allons tout doucement passez au cœurs du développement de l’application. Mais avant de commencer le développement à proprement parlé, je vous invite à vous familiarisé avec les conventions de design sous ubuntu touch en découvrant le kit de d’utilisation (toolkit) d’ubuntu ui (user interface) . Ubuntu ui – toolkit Lorsque vous avez installé le sdk ubuntu, vous avez aussi installé de petit exemples d’utilisations des composants ubuntu. Dans ce bref tutoriel, nous allons nous intéresser aux différents composants existant pour ubuntu touch.   Ouverture du toolkit Le projet est situé dans le répertoire « /usr/lib/ubuntu-ui-toolkit/examples/ » Dans Qt, faire CTRL + o pour ouvrir un nouveau projet, puis collez /usr/lib/ubuntu-ui-toolkit/examples/ dans la barre de location, comme dans l’exemple ci-dessous :   Ensuite, presser la touche entrer, vous devriez atterrir dans le répertoire choisi : Vous avez comme projet de démonstration une calculatrice et une application de conversion d’unité. Je vous laisserais avoir la curiosité d’aller regardé ces applications. Ici, l’application qui nous intéresseras seras la galerie de toolkit (ubuntu-ui-toolkit-gallery). Double clickez sur le répertoire « ubuntu-ui-toolkit-gallery » et choisissez le fichier « ubuntu-ui-toolkit-gallery.qmlproject » : Ensuite vous pouvez lancer l’application de démonstration des composants ubuntu en cliquant sur CTRL + R : Nous allons voir comment utilisez la navigation dans le prochain...

Read More

Ubuntu touch – Comment parser une API JSON dans un ListView

Ubuntu touch – Comment parser une API JSON dans un ListView

Bonjour à tous, Dans ce petit tutoriel rapide on va voir comment récupérer les données d’une API JSON et de les afficher dans un ListView. Voici un petit exemple du résultat final : Qt fournis déjà une petite feature l XMLListModel qui permet de paser aisément du XML. Malheureusement aucun component ne permet de le faire en JSON. Un peut partout sur le net on trouve des petites bidouilles pour le faire via du javascript. L’utilisation du javascript pure est simple et efficace. Le seul bémol c’est lorsqu’on commence à avoir une API un petit peut compliqué, le code deviens très vite désorganisé. Heureusement, la nature ayant horreur du vide. Un grand merci à  Romain Pokrzywka qui nous à préparer un petit component pour parser du JSON : JSONListModel. C’est beaucoup plus propre que d’utiliser du javascript pure. Il suffit de télécharger les fichier JSONListModel.qml et jsonpath.js. Insérer les dans votre projet et le tour est joué. Voici une petite démo d’utilisation: JavaScript import QtQuick 2.0 import Ubuntu.Components 1.1 import Ubuntu.Components.ListItems 1.0 as ListItem /*! \brief MainView with a Label and Button elements. */ MainView { // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest applicationName: "com.ubuntu.developer.username.newapp" /* This property enables the application to change orientation when the device is rotated. The default is false. */ //automaticOrientation: true // Removes the old toolbar and enables new features of the new header. useDeprecatedToolbar: false width: units.gu(100) height: units.gu(75) Page { title: i18n.tr("Morgan Blog - demo") ListView { id: redditList anchors.fill: parent JSONListModel { id: redditFeed source: "http://www.reddit.com/r/Ubuntufr/hot.json" query: "$.data.children[*]" } model: redditFeed.model delegate: ListItem.Subtitled { Component.onCompleted: console.log(model.data.title+"\n"); iconSource: model.data.thumbnail Text { width: parent.width horizontalAlignment: Text.AlignLeft font.pixelSize: 12 color: "black" text: model.data.title } } } } } 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 import QtQuick 2.0import Ubuntu.Components 1.1import Ubuntu.Components.ListItems 1.0 as ListItem/*!    \brief MainView with a Label and Button elements.*/ MainView {    // objectName for functional testing purposes (autopilot-qt5)    objectName: "mainView"     // Note! applicationName needs to match the "name" field of the click manifest    applicationName: "com.ubuntu.developer.username.newapp"     /*     This property enables the application to change orientation     when the device is rotated. The default is false.    */    //automaticOrientation: true     // Removes the old toolbar and enables new features of the new header.    useDeprecatedToolbar: false     width: units.gu(100)    height: units.gu(75)     Page {        title: i18n.tr("Morgan Blog - demo")        ListView {            id: redditList             anchors.fill: parent            JSONListModel {                id: redditFeed                source: "http://www.reddit.com/r/Ubuntufr/hot.json"                query: "$.data.children[*]"            }            model: redditFeed.model            delegate: ListItem.Subtitled {                 Component.onCompleted: console.log(model.data.title+"\n");                iconSource: model.data.thumbnail                Text {                    width: parent.width                    horizontalAlignment: Text.AlignLeft                    font.pixelSize: 12                    color: "black"                    text: model.data.title                 }            }        }    }}    ...

Read More

Comment mettre un background à un TextField

Comment mettre un background à un TextField

Bonjour à tous, aujourd’hui je vous fais découvrir une petite astuce, toute simple pour pouvoir mettre un background à un TextField. Ce petit trick ne casse pas des briques mais ça fais un bon petit aide mémoire. Il faut préférer l’utilisation d’un « TextField » plutôt qu’un « TextInput« , grâce à cela vous pourrez utiliser « TextFieldStyle » qui permet de personnalisé le TextField. JavaScript import QtQuick 2.0 import Ubuntu.Components 1.1 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 MainView { id: main width: 400 height: 300 Column { spacing: units.gu(2) anchors.centerIn: parent TextInput { text: "TextInput par defaut" cursorVisible: false width: main.width - units.gu(25) } TextField { placeholderText: "TextField par defaut" width: main.width - units.gu(25) } TextField { placeholderText: "TextField avec background" width: main.width - units.gu(25) text: "TextField avec background" style: TextFieldStyle { textColor: "black" background: Rectangle { radius: 5 color: "orange" implicitWidth: 100 implicitHeight: 24 border.color: "#333" border.width: 1 } } } } } 12345678910111213141516171819202122232425262728293031323334353637383940 import QtQuick 2.0import Ubuntu.Components 1.1import QtQuick.Controls 1.1import QtQuick.Controls.Styles 1.1 MainView {    id: main    width: 400    height: 300     Column {        spacing: units.gu(2)        anchors.centerIn: parent        TextInput {            text: "TextInput par defaut"            cursorVisible: false            width: main.width - units.gu(25)        }        TextField {            placeholderText: "TextField par defaut"            width: main.width - units.gu(25)        }        TextField {            placeholderText: "TextField avec background"            width: main.width - units.gu(25)            text: "TextField avec background"            style: TextFieldStyle {                textColor: "black"                background: Rectangle {                    radius: 5                    color: "orange"                    implicitWidth: 100                    implicitHeight: 24                    border.color: "#333"                    border.width: 1                }            }        }    }} Et voici le rendu :  ...

Read More

Comment utiliser le système de notification avec qml et unity

Comment utiliser le système de notification avec qml et unity

Comment utiliser le système de notification d’ubuntu (et d’autres distribution) depuis QML ? Autant que je le sache, il n’existe pas d’API QML pour accéder au système de notification. Pour éviter d’avoir à créer un plugin C++ pour avoir les notifications sur une application desktop, il est plus simple d’utiliser pyotherside et d’appeler un petit module python pour effectuer le travail. Pré-requis : Vous l’aurez compris, il suffit de s’assurer que pyotherside est installé. D’abbord, assuré vous d’avoir les bon ppa Shell sudo add-apt-repository ppa:ubuntu-sdk-team/ppa sudo add-apt-repository ppa:checkbox-dev/ppa sudo apt-get update 123 sudo add-apt-repository ppa:ubuntu-sdk-team/ppasudo add-apt-repository ppa:checkbox-dev/ppasudo apt-get update puis lancer l’installation Shell sudo ap-get install pyotherside 1 sudo ap-get install pyotherside Au boulot : Et voici la petite application QML : JavaScript import QtQuick 2.0 import Ubuntu.Components 1.1 import io.thp.pyotherside 1.2 /*! \brief MainView with a Label and Button elements. */ MainView { // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest applicationName: "com.ubuntu.developer.username.notification" /* This property enables the application to change orientation when the device is rotated. The default is false. */ //automaticOrientation: true // Removes the old toolbar and enables new features of the new header. useDeprecatedToolbar: false width: units.gu(100) height: units.gu(75) Page { title: i18n.tr("Simple") Column { spacing: units.gu(1) anchors { margins: units.gu(2) fill: parent } Label { id: label objectName: "label" text: i18n.tr("Hello..") } Button { objectName: "button" width: parent.width text: i18n.tr("Tap me!") onClicked: { //label.text = i18n.tr("..world!") py.call('notify.pressme', [], function() {}); } } Python { id: py Component.onCompleted: { addImportPath(Qt.resolvedUrl('.')); importModule('notify', function() {}); } } } } } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 import QtQuick 2.0import Ubuntu.Components 1.1import io.thp.pyotherside 1.2/*!    \brief MainView with a Label and Button elements.*/ MainView {    // objectName for functional testing purposes (autopilot-qt5)    objectName: "mainView"     // Note! applicationName needs to match the "name" field of the click manifest    applicationName: "com.ubuntu.developer.username.notification"     /*     This property enables the application to change orientation     when the device is rotated. The default is false.    */    //automaticOrientation: true     // Removes the old toolbar and enables new features of the new header.    useDeprecatedToolbar: false     width: units.gu(100)    height: units.gu(75)     Page {        title: i18n.tr("Simple")         Column {            spacing: units.gu(1)            anchors {                margins: units.gu(2)                fill: parent            }             Label {                id: label                objectName: "label"                 text: i18n.tr("Hello..")            }             Button {                objectName: "button"                width: parent.width                 text: i18n.tr("Tap me!")                 onClicked: {                    //label.text = i18n.tr("..world!")                      py.call('notify.pressme', [], function() {});                }            }            Python {                  id: py                  Component.onCompleted: {                      addImportPath(Qt.resolvedUrl('.'));                      importModule('notify', function() {});                  }              }        }    }} ensuite créer un fichier nommé notify.py dans le même répertoire que le fichier qml Python #!/usr/bin/env python3 import subprocess def pressme(): subprocess.call(["notify-send", "hello morgan", "http://morgan-durand.com"]) 123456 #!/usr/bin/env python3 import subprocess def pressme():    subprocess.call(["notify-send", "hello morgan", "http://morgan-durand.com"]) Et voila le...

Read More