Premiers pas avec un projet Ionic/Django

Installer Ionic

  1. Installer NodeJs

  2. Installer Ionic depuis une ligne de commandes

       npm install -g @ionic/cli
    

Installer Django

  1. Installer Python

  2. Installer Django depuis une ligne de commandes

       py -m pip install Django
    

Installer VirtualEnv pour utiliser des environnements virtuels Python

  1. Installer virutalenv si ce n’est pas déjà le cas

       pip install virtualenv
    
  2. Rentrer dans le dossier du projet et créer un environnement virtuel si ça n’a pas été fait précédemment. Ex

       virtualenv venv
    

Après cette ligne de commandes nous devrons avoir un nouveau dossier venv à la racine de notre projet

  1. Activer l’environnement virtuel depuis une ligne de commandes

       .\venv\Scripts\activate
    

  1. Maintenant nous pouvons lancer la ligne de commande ci-dessous pour s’assurer que tous les packages Pÿthon sont installés pour notre projet dans notre environnement virtuel:

        pip install -r requirements
    

Création d’un projet Django

(Vidéo référence du tutoriel)

On commence par créer une application avec le nom souhaité. Par exemple: api_app.

       django-admin startproject api_app

Ensuite nous rentrons dans le dossier de notre application Django, en l’occurence api_app et on crée une nouvelle application principale, par exemple mainapp

       python manage.py startapp mainapp

Afin de pouvoir "brancher" notre app principale mainapp à l’app Django nous devons éditer le fichier settings.py et dans INSTALLED_APPS nous ajoutons à la dernière ligne notre app et nous en profitons aussi pour ajouter les corsheaders. Comme dans l’exemple ci-dessous:

       INSTALLED_APPS = [ ..,  'mainapp', 'corsheaders',]

Si on veut pouvoir accéder à l’api depuis le frontend il faut aussi ajouter dans le même fichiers les champs suivants:

       MIDDLEWARE = [ .., 'corsheaders.middleware.CorsMiddleware',]
       CORS_ORIGIN_ALLOW_ALL = False
       CORS_ORIGIN_WHITELIST = ('http://localhost:8100',)

Maintenant nous pouvons lancer l’api en exécutant la ligne de commandes ci-dessous:

      python manage.py runserver

Egalement on peut lui indiquer le port sur lequel on veut la lancer. Ex:

      python manager.py runserver 3000

Un petit exemple de comment faire une migration de la base de donnée:

     python manage.py makemigrations mainapp
     python manage.py migrate mainapp

Création d’un projet Ionic

On revient dans le dossier racine de notre projet et nous créons un projet Ionic (ex: web_app) comme dans l’exemple ci-dessous:

      ionic start --no-git web_app

Nous choisissons ensuite le framework sur lequel nous souhaitons travailler: Angular, ReactJS, Vue. Dans notre cas: Angular

(Attention: On est pas obligés de créer un compte Ionic)

Si on fait attention le plugin Capacitor s’installera aussi en même temps que le reste. Ce plugin sert à générer le code source natif de n’import quelle plateforme mobile(android, ios). Ex:

       ionic capacitor add android

ou

       ionic capacitor add ios

Après avoir fait tout ça il nous reste la dernière étape: lancer l’app Ionic:

       ionic serve

Installation de Gitlab avec Docker Compose et mise en place d’un runner pour notre projet GitLab

(Fait sur linux)

1) Premièrement il faut créer le dossier où on installera GitLab

mkdir ~/gitlab
export GITLAB_HOME=$(pwd)/gitlab

2) Créer le fichier docker-compose dans ~/gitlab

# docker-compose.yml
version: '3.7'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'localhost'
    container_name: gitlab-ce
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost'
    ports:
      - '8080:80'
      - '8443:443'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    networks:
      - gitlab
  gitlab-runner:
    image: gitlab/gitlab-runner:alpine
    container_name: gitlab-runner    
    restart: always
    depends_on:
      - web
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - '$GITLAB_HOME/gitlab-runner:/etc/gitlab-runner'
    networks:
      - gitlab

networks:
  gitlab:
    name: gitlab-network

3) Lancer les lignes des commandes ci-dessous

docker-compose up -d
docker exec -it gitlab-ce grep 'Password:' /etc/gitlab/initial_root_password

4) Aller sur (dans ce cas la) localhost et essayer de se connecter avec l’username “root” et le mot de passe qu’on a saisie à l’étape 3

5) En cas de pas pouvoir se connecter à cause de crédentials

docker exec -it d0bbe0e2e0bbdb bash <=== avec le CONTAINER_ID de Gitlab with your CONTAINER_ID

gitlab-rails console -e production

user = User.where(id: 1).first
user.password = 'your secret'
user.password_confirmation = 'your secret'
user.save
exit

6) Assigner un Gitlab-runner à note projet

En imaginant qu’on a déjà créé un projet sur GitLab, en l’occurence, “ProjectTest” il nous reste qu’à registrer un runner en lui spécifiant l’url, token, description, type d’executeur et autres.
Pour celle-là on récupère les informations nécessaire en nous guidant de l’image ci-dessous:

Maintenant il nous reste qu’à lancer la commande ci-dessous et saisir les données récupèrés (image)

gitlab-runner register

Maintenant le runner existe et tout devrait marcher. Pour s’assurer qu’il est marche on va au même endroit que comme montré dans l’image ci-dessus. Il devrait avoir un rond vert comme montré ci-dessous:

Si ce n’est pas le cas alors il faut lancer les runner avec la ligne de commande suivante:

gitlab-runner run

🙂

Pourquoi choisir Kotlin ?

Kotlin est un langage de programmation à typage statique sponsorisé et développé par JetBrains qui s’exécute sur la machine virtuelle Java et peut également être compilé en code source JavaScript ou utiliser l’infrastructure de compilateur LLVM. 

Voici quelques raisons pour lesquelles vous devriez basculer totalement vers Kotlin (  référence ):

0. Interopérabilité Java

Kotlin est 100% interopérable avec Java. Vous pouvez littéralement continuer à travailler sur vos anciens projets Java avec Kotlin. Tous vos frameworks Java préférés sont toujours disponibles, et quel que soit le framework que vous écrivez dans Kotlin, il est facilement adopté par votre ami Java.

1. Syntaxe familière

Le kotlin n’est pas une langue étrange née dans le monde universitaire. Sa syntaxe est familière à tout programmeur issu du domaine de la programmation orientée objet et peut être plus ou moins comprise dès le départ. Il existe bien sûr quelques différences avec Java, telles que les constructeurs retravaillés ou les déclarations de variables val var. L’extrait ci-dessous présente la plupart des bases:

class Foo {

val b: String = “b” // val = variable qu’on ne peut pas modifier
var i: Int = 0 // var = variable modifiable

fun hello() {
val str = “Hello”
print(“$str World”)
}

fun sum(x: Int, y: Int): Int {
      return x + y
}

fun maxOf(a: Float, b: Float) = if (a > b) a else b

}

2. Interpolation de chaîne

C’est comme si une version plus intelligente et plus lisible de Java, String.format () était intégrée au langage:

val x = 4
val y = 7
print(“sum of $x and $y is ${x + y}”) // addition de  4 et 7 est  11

3. Type Inference

Kotlin déduira vos types partout où vous pensez que cela améliorera la lisibilité:

val a = “abc” // type inféré à String
val b = 4 // type inféré à Int

val c: Double = 0.7 // type déclaré explicitement
val d: List = ArrayList() // type déclaré explicitement

4. Casts intélligents

Le compilateur Kotlin suit votre logique et, si possible, les types de conversions automatiques, ce qui signifie qu’il n’y a plus d’instance de vérifications suivie de distributions explicites:

if (obj is String) {
print(obj.toUpperCase()) // obj maintenant est reconnu comme un objet String
}

5. Égal intuitif

Vous pouvez arrêter d’appeler explicitement equals(), car l’opérateur == vérifie maintenant l’égalité structurelle:

val john1 = Person(“John”)
val john2 = Person(“John”)

john1 == john2 // true (égalité structurelle)
john1 === john2 // false (égalité structurelle)

6. Arguments par défaut

Pas besoin de définir plusieurs méthodes similaires avec des arguments différents:

fun build(title: String, width: Int = 800, height: Int = 600) {
Frame(title, width, height)
}

7. Arguments nommés

Combinés aux arguments par défaut, les arguments nommés éliminent le besoin de générateurs:

build(“MarioBros”, 700, 400) // équivalent
build(title = “MarioBros”, width = 700, height = 400) // équivalent
build(width = 700, height = 400, title = “MarioBros”) // équivalent

8. L’expression When

Le boîtier du commutateur est remplacé par l’expression beaucoup plus lisible et flexible:


when (x) {

 1 -> print(“x is 1”)
2 -> print(“x is 2”)
3, 4 -> print(“x is 3 or 4”)
in 5..10 -> print(“x is 5, 6, 7, 8, 9, or 10”)
else -> print(“x is out of range”)

}

Cela fonctionne à la fois comme une expression ou une déclaration et avec ou sans un argument:

val res: Boolean = when {

obj == null ->false
obj is String -> true
else -> throw IllegalStateException()

}

9. Propriétés

Un ensemble personnalisé et un comportement peuvent être ajoutés aux champs publics, ce qui signifie que nous pouvons arrêter de gonfler notre code avec des getters et des setters insensés.

class Frame {

      var width: Int = 800
      var height: Int = 600

val pixels: Int
get() = width * height

}

10. The Data Class

C’est un POJO complet avec toString(), equals(), hashCode() et copy(), et contrairement à Java, il ne prendra pas 100 lignes de code:

data class Person(val name: String, var email: String, var age: Int)

val john = Person(“John”, “john@gmail.com”, 112)

11. Surcharge de l’opérateur

Un ensemble prédéfini d’opérateurs peut être surchargé pour améliorer la lisibilité:

data class Vec(val x: Float, val y: Float) {
      operator fun plus(v: Vec) = Vec(x + v.x, y + v.y)
}

val v = Vec(2f, 3f) + Vec(4f, 1f)

12. Déclarations de destructuration

Certains objets peuvent être déstructurés, ce qui est par exemple utile pour itérer des map:

for ((key, value) in map) {
print(“Key: $key”)
print(“Value: $value”)
}

13. Ranges

Par souci de lisibilité:

for (i in 1..100) { … }
for (i in 0 until 100) { … }
for (i in 2..10 step 2) { … }
for (i in 10 downTo 1) { … }
if (x in 1..10) { … }

14. Fonctions d’extension

Rappelez-vous la première fois que vous avez dû trier une liste en Java? Comme vous ne pouviez pas trouver une fonction sort(), vous deviez demander à votre tuteur ou à Google de se renseigner sur Collections.sort (). Et plus tard, lorsque vous avez dû mettre en majuscule une chaîne, vous avez fini par écrire votre propre fonction d’assistance car vous ne connaissiez pas StringUtils.capitalize().

Si seulement il y avait un moyen d’ajouter de nouvelles fonctions aux anciennes classes; De cette façon, votre IDE pourrait vous aider à trouver la bonne fonction dans la complétion de code. Avec Kotlin vous pouvez faire exactement ça:

fun String.replaceSpaces(): String {
      return this.replace(‘ ‘, ‘_’)
}

val formatted = str.replaceSpaces()

 

La bibliothèque standard étend les fonctionnalités des types originaux de Java, ce qui était particulièrement nécessaire pour String:

str.removeSuffix(“.txt”)
str.capitalize()
str.substringAfterLast(“/”)
str.replaceAfter(“:”, “classified”)

15. Null Safety

Java est ce que nous devrions appeler un langage typé de manière quasi statique. Dans ce document, une variable de type String ne garantie pas une référence à une chaîne – elle peut faire référence à null. Même si nous sommes habitués à cela, cela réduit à néant la sécurité de la vérification de type statique et oblige aux développeurs Java à vivre dans la peur constante des NPE ( Non-Permissive Environment Contents ).

Kotlin résout ce problème en distinguant les types non null et les types nullable. Les types ne sont pas nuls par défaut et peuvent être rendus nuls en ajoutant un ? Comme ceci:

var a: String = “abc”
a = null // compile error

var b: String? = “xyz”
b = null // pas de problème

 

Kotlin vous oblige à vous prémunir contre les NPE lorsque vous accédez à un type nullable:

val x = b.length // compile error: b peut-être null

Et même si cela peut sembler fastidieux, c’est vraiment un jeu d’enfant grâce à quelques-unes de ses fonctionnalités. Nous avons toujours des distributions intelligentes, qui convertissent les types nullable en non-null chaque fois que c’est possible:

if (b == null) return
val x = b.length // pas de problème

 

Nous pourrions également utiliser un appel sécurisé ?., Qui renvoie null au lieu de lancer un NPE:

val x = b?.length // type de x est nullable Int

Les appels sécurisés peuvent être chaînés pour éviter ces vérifications imbriquées si-non-null, nous écrivons parfois dans d’autres langues, et si nous voulons une valeur par défaut autre que null, nous pouvons utiliser l’opérateur ?: :

val name = ship?.captain?.name ?: “unknown”

 

Si rien de tout cela ne fonctionne pour vous et que vous avez absolument besoin d’un NPE, vous devrez le demander explicitement:

val x = b?.length ?: throw NullPointerException() // le même que celui au dessous
val x = b!!.length // le même que celui au dessus

16. Des meilleurs Lambdas

Très bon système lambda, parfaitement équilibré entre lisibilité et nuance, grâce à des choix de conception astucieux. La syntaxe est d’abord simple:

val sum = { x: Int, y: Int -> x + y } // type: (Int, Int) -> Int
val res = sum(4,7) // res == 11

 

Et voici les astuces:

  1. Les parenthèses de méthode peuvent être déplacées ou omises si le lambda est le dernier ou le seul argument d’une méthode.
  2. Si nous choisissons de ne pas déclarer l’argument d’un seul argument-lambda, il sera déclaré implicitement sous le nom it.

Ces faits combinés rendent les trois lignes suivantes équivalentes:

numbers.filter({ x -> x.isPrime() })
numbers.filter { x -> x.isPrime() }
numbers.filter { it.isPrime() }

 

Et cela nous permet d’écrire un code fonctionnel concis – il suffit de regarder cette beauté:

persons
.filter { it.age >= 18 }
.sortedBy { it.name }
.map { it.email }
.forEach { print(it) }

 

Le système lambda de Kotlin associé à des fonctions d’extension le rend idéal pour la création DSL. Exemple:

verticalLayout {
padding = dip(30)
editText {
hint = “Name”
textSize = 24f
}
editText {
hint = “Password”
textSize = 24f
}
button(“Login”) {
textSize = 26f
}
}

Swift 3 – Press and LongPress

Here you have an example with a simple Tap and a long Tap.

    override func viewWillAppear(_ animated: Bool)
    {

      super.viewWillAppear(animated)
      let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped(_:) ))
      buttonTakeShare.addGestureRecognizer(tapGestureRecognizer)let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressed(_:)))
      buttonTakeShare.addGestureRecognizer(longPressRecognizer)

    }

    func tapped(_ sender: UITapGestureRecognizer)
    {

      print(“That is a simple tap”)

    }

    func longPressed(_ sender: UITapGestureRecognizer)
    {

      switch sender.state
      {
      case UIGestureRecognizerState.ended:
      print(“Long Press Finished”)
      default: break
      }

    }

Skeletoraxe. Animations with Haxe

Over 2 years ago I  was confronted head-on by the problem of Flash-Smartphones / Tablets transition: how to export Flash animations and make them work in our devices ?

After several searches on the web I learned that there were two types of methods to export animations: Spritesheet or Skeletal. The most commonly method used at that time was Spritesheet which create/export a complete image for each frame of the animation.
In my case I realized quickly that this method wasn’t ideal for my game GhostSplash which had more than 100 animations. Animations which had to be exported as big as possible because I had to make them work with the best possible resolution at any devices. TOO MUCH !

The Skeletal method was indeed the fittest, but back then there wasn’t Haxe  libraries to export my animations. Spine and GAF was the only alternatives but either were expensive or simply had not been implemented the Haxe version . Dragon Bones was one of the few wich proposed a free version but it only existed for AS3 and Flash.
It is for that reason that I decided to create Skeletoraxe.
I hope this library will be useful

Enjoy it !

You can download Skeletoraxe right here.

And here you are a little tutorial to learn how it works

Molotov TV ya llegó

Avant tout, désolé, mais j’avais envie d’écrire ce post en espagnol pour le fan 🙂

Tras varios años de trabajo ( más o menos 3 ), Molotov TV, proyecto llevado a cabo por Pierre Lescure y el cofundador de Allociné Jean-David Blanc, ya está aqui entre nosotros para volverle a dar otro sentido a la televisión.

Por el momento solo está disponible para ordenador ( Mac y PC ), iPad y Apple TV, pero pronto lo veremos también para Android.

Es un servicio que nos propone 35 canales gratuitos y también una serie de canales ( 37 en total ) de pago por el modesto precio de 9.99 euros/mes.

Ya no digo más, os dejo descubrirlo a vosotros mismos. Aquí tenéis el enlance:

http://www.molotov.tv/

 

8608

Adobe Flash is becoming Adobe Animate CC

 

As we all know FLASH was condemned the moment Apple does not support it on the iPhone.

Over the last 4 years we have seen how Flash has been gradually disappearing from the market and even perceived as a toxic brand. It is for these reasons that Adobe has decided take the big step and kill definitely FLASH for giving way to Animate CC.

Already Flash features HTML5 Canvas and WebGL support, and Animate CC will continue to support and AIR SWF formats; so no changes there. However, there will be a series of new features added before the release date in early 2016, Which include:

+ 4k video support;

vector art brushes;

SVG animation for export;

colored onion skinning;

rotatable canvas;

Deep Integration with Adobe Stock;

integration with shared libraries.

However, i have not found any specification on how to export animations. Adobe opt for exportation in spritesheet? a exportation in skeletal animation (as GAF, Skeletoraxe or Spine)? or both?

Support for 100MB APKs on Google Play

Smartphones are powerful devices that can support diverse tasks from graphically intensive games to helping people get work done from anywhere. We understand that developers are challenged with delivering a delightful user experience that maximizes the hardware of the device, while also ensuring that their users can download, install, and open the app as quickly as possible. It’s a tough balance to strike, especially when you’re targeting diverse global audiences.

To support the growing number of developers who are building richer apps and games on Google Play, we are increasing the APK file size limit to 100MB from 50MB. This means developers can publish APKs up to 100MB in size, and users will see a warning only when the app exceeds the 100MB quota and makes use of Expansion Files. The default update setting for users will continue to be to auto-updating apps over Wi-Fi only, enabling users to access higher quality apps and games while conserving their data usage.

Even though you can make your app bigger, it doesn’t always mean you should. Remember to keep in mind the following factors:

Mobile data connectivity: Users around the world have varying mobile data connectivity speeds. Particularly in developing countries, many people are coming online with connections slower than those of users in countries like the U.S. and Japan. Users on a slow connection are less likely to install an app or game that is going to take a long time to download.
Mobile data caps: Many mobile networks around the world give users a limited number of MB that they can download each month without incurring additional charges. Users are often wary of downloading large files for fear of exceeding their limits.
App performance: Mobile devices have limited RAM and storage space. The larger your app or game, the slower it may run, particularly on older devices.
Install time: People want to start using your app or game as quickly as possible after tapping the install button. Longer wait times increase the risk they’ll give up.
We hope that, in certain circumstances, this file size increase is useful and enables you to build higher quality apps and games that users love.

Original source: http://android-developers.blogspot.co.uk/2015/09/support-for-100mb-apks-on-google-play.html