These are chat archives for gitlinks/github-rank-project

21st
Jun 2015
Jacob Tardieu
@jacobtardieu
Jun 21 2015 11:36
@callicles tu es dans le coin ?
Nicolas Joseph
@callicles
Jun 21 2015 11:46
yep
Jacob Tardieu
@jacobtardieu
Jun 21 2015 11:47
Je suis en train de regarder pour ce que j'avais à faire sur le serveur
J'ai vu que poc a déjà fait le build de l'image docker depuis circle ci
Ça a l'air de bien marcher
Et c'est quoi le but ensuite, que ce soit déployé tout seul avec openshift ?
Nicolas Joseph
@callicles
Jun 21 2015 11:48
oui
sur le serveur de test
la on a circle-ci -> docker hub
il manque docker hub -> serveur de test
(sur lequel on utilise openshift
)
Jacob Tardieu
@jacobtardieu
Jun 21 2015 11:49
Et ça va nous servir à quoi openshift ?
Juste à déployer le docker ?
Nicolas Joseph
@callicles
Jun 21 2015 11:49
il y a aussi une base neo4j à mettre
et à deployer
pour le backend
L’idée est la suivante : On compte utiliser le Paas openshift de red hat parce qu’il est gratuit pour de l’open source
et que du coup on aura pas à gérer l’infra en production
pour avoir un env de test equivalent à ce qui va tourner en prod il faut donc un openshift sur le serveur de test
d’ou l’install d’openshift sur le serveur d'online
Jacob Tardieu
@jacobtardieu
Jun 21 2015 11:53
si j'ai bien compris pour openshift on l'installe sur des serveurs et il se charge de déployer ?
Mais il faut quand même un serveur ?
Nicolas Joseph
@callicles
Jun 21 2015 11:56
il y a 2 trucs:
  • Openshift Origin: C’est la solution open source developpée pour faire de la gestion de containers sur un cluster de machine (ça peut etre une machine)
  • Openshift: Service proposé par redhat basé sur openhift origin qui gère toute l’infrastructure et met à disposition des nodes openshift pour deployer des trucs dans le cloud de redHat
Donc nous on installer origin sur notre serveur de test
et ensuite on devrait utiliser le service pour deployer notre production
Jacob Tardieu
@jacobtardieu
Jun 21 2015 11:59
Ouais mais d'après ce que j'ai vu sur le service les machines il faut les payer
Nicolas Joseph
@callicles
Jun 21 2015 12:00
pas en opensource
on peut demander des resources
ce que je compte faire
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:00
J'ai juste vu qu'ils donnaient un crédit initial
Mais pas que c'était entièrement gratuit
Nicolas Joseph
@callicles
Jun 21 2015 12:00
une fois qu’on aura un truc decent
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:00
Si on parle bien de ça : https://www.openshift.com/resource-grants
Nicolas Joseph
@callicles
Jun 21 2015 12:02
oui
Please be as detailed as possible about your project and the resources that you are requesting access to. You may want to review our pricing page before filling out this form to see what kind of resources we currently offer. It would also be useful to review our Developer Center to make sure that the technologies that you would like to use are available and/or supported on the OpenShift Online PaaS.
De ce que je comprend on demande des trucs
et ils nous les accorde ou pas
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:10
Mmmmm je suis sceptique
On verra bien
Au fait on pourrait peut-être acheter dès maintenant un nom de domaine non ?
D'ailleurs c'est gitrank ou gitranks ?
Nicolas Joseph
@callicles
Jun 21 2015 12:13
on peut
je pensais acheter chez ghandi
gandi.net
gitrank
enfin c’est debatable
gitrank est pas trop dispo
après ça dépend de l’extension qu’on veut
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:14
Bah si
gitrank.io
Nicolas Joseph
@callicles
Jun 21 2015 12:14
oui
celui la :)
mais pas .com
je crois
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:15
On s'en fout
.com c'est pourri
Nicolas Joseph
@callicles
Jun 21 2015 12:15
pourquoi tu mettrais un s à gitrank
?
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:15
Je sais pas
Nicolas Joseph
@callicles
Jun 21 2015 12:15
ok
bah je vais acheter gitrank.io alors
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:16
Si tu veux je le fais
Je l'ai dans mon panier déjà
Nicolas Joseph
@callicles
Jun 21 2015 12:16
sur gandi ?
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:16
Ouais
Nicolas Joseph
@callicles
Jun 21 2015 12:16
ok
vas y
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:18
C'est bon
Nicolas Joseph
@callicles
Jun 21 2015 12:18
cool :)
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:18
C'est con de pas avoir gitlinks aussi
Mais ça va commencer à faire un peu cher
Nicolas Joseph
@callicles
Jun 21 2015 12:19
t’as vu le concours de github ?
on prend gitlinks si on gagne :)
le fric
(et qu’ils reitèrent cette année)
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:21
Non pas vu
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:26
Ouais je sais pas si on aura le temps de faire un truc assez chiadé pour gagner le concours
J'ai fait pointer le A du la racine vers l'IP de la machine
Nicolas Joseph
@callicles
Jun 21 2015 12:26
regarde ce qui a gagné l’année derniere
je pense que c’est faisable
et puis vu les prix on veut pas arriver premier
le fric pour payer les noms de domaine c’est ce qu’on veut
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:29
Ah ouais le premier est pas si compliqué mais super utile
Je comprends qu'il ait gagné
J'ai fait des mails aussi : prénom@gitrank.io revoie sur nos adresses perso
Nicolas Joseph
@callicles
Jun 21 2015 12:30
cool, merci
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:31
Ça sera pleinement actif sous 24 à 72 heures
Nicolas Joseph
@callicles
Jun 21 2015 12:36
parfait
j’ai pensé à te le demandé mais je me suis dit que ça pourrait attendre :)
du c’est fait
du coup*
Nicolas Joseph
@callicles
Jun 21 2015 12:56
@jacobtardieu t’as pu tester le ssh ?
Jacob Tardieu
@jacobtardieu
Jun 21 2015 12:56
Oui oui je suis connecté dessus
J'ai vite fait commencé à bidouiller
En me connectant sur le docker openshift
Mais il va falloir que je lise un peu de doc
Nicolas Joseph
@callicles
Jun 21 2015 13:25
ok
parfait
Thomas
@pocman
Jun 21 2015 13:51
ça a l'air sympa http://ghtorrent.org
histoire d'avoir une base pour commencer sans pour autant avoir besoin d'utiliser l'api de manière intensive
y'a tous les repos / users
par contre les dump sont des dump mysql
ils utilisent https://api.github.com/events comme source de données
Nicolas Joseph
@callicles
Jun 21 2015 14:25
yop
effectivement, on pourrait passer par la
à voir pour recuperer quoi
il y avait github archive
aussi
Nicolas Joseph
@callicles
Jun 21 2015 14:52
j’ai utilisé le driver Anorm
mais ça ne fonctionne pas (une exception levée dans une classe de la lib)
je pense que c’est du à Cypher et à sa synthaxe
potentielement
du coup je vais essayer en utilisant directement l’api de neo
en envoyant les requetes à la main
ça fonctionnera peut être mieux
Nicolas Joseph
@callicles
Jun 21 2015 17:01
@jacobtardieu Dans le coin ? je galère sur un truc de scala
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:05
Ouais
Nicolas Joseph
@callicles
Jun 21 2015 17:05
j’essaye d’extraire un objet d’une structure json
voila mon json
{
    "results": [
        {
            "columns": [
                "n"
            ],
            "data": [
                {
                    "row": [
                        {
                            "name": "World"
                        }
                    ]
                },
                {
                    "row": [
                        {
                            "name": "World",
                            "test": "otherProperty"
                        }
                    ]
                }
            ]
        }
    ],
    "errors": []
}
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:06
Fail
Mieux
Nicolas Joseph
@callicles
Jun 21 2015 17:07
je le recupère avec ws
 val request: WSRequest = ws.url(NEO4J_ENPOINT + "transaction/commit")

    request.post(Json.toJson(
      "statements" -> Seq(
        Json.toJson(Map(
          "statement" -> """MATCH (n:User) WHERE n.userID = {userID} RETURN n""",
          "parameters" -> Json.toJson(Map(
            "userID" -> userID.toString
          ))
        ))
      )
    )).map(response => {
      val neoResp = Json.parse(response.body)
      (neoResp \\ "results").foreach(result => {
        (result \\ "data").foreach(data => {
          (data \\ "row").foreach(user =>
            User(
              UUID.fromString((user \ "userID").as[String]),
              LoginInfo((user \ "loginInfo" \ "providerID").as[String], (user \ "loginInfo" \ "providerKey").as[String]),
              Some((user \ "firstName").as[String]),
              Some((user \ "lastName").as[String]),
              Some((user \ "fullName").as[String]),
              Some((user \ "email").as[String]),
              Some((user \ "avatarUrl").as[String])
            )
          )
        })
      })
    })
Letruc c’est que je ne veut que recuperer le User
(il n’y en a qu’un je le recup avec le UUID)
mais bon j’ai quand même des listes partout
si je met des map il renvoie que des listes
et je veux pas faire de var
...
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:11
?
C'est quelle partie qui marche mal
Le parsing de user c'est bon ?
Nicolas Joseph
@callicles
Jun 21 2015 17:12
bah ça ça me renvoie rien pour le moment
ma methode
  def find(userID: UUID) = {
    val request: WSRequest = ws.url(NEO4J_ENPOINT + "transaction/commit")

    request.post(Json.toJson(
      "statements" -> Seq(
        Json.toJson(Map(
          "statement" -> """MATCH (n:User) WHERE n.userID = {userID} RETURN n""",
          "parameters" -> Json.toJson(Map(
            "userID" -> userID.toString
          ))
        ))
      )
    )).map(response => {
      val neoResp = Json.parse(response.body)
      (neoResp \\ "results").foreach(result => {
        (result \\ "data").foreach(data => {
          (data \\ "row").foreach(user =>
            User(
              UUID.fromString((user \ "userID").as[String]),
              LoginInfo((user \ "loginInfo" \ "providerID").as[String], (user \ "loginInfo" \ "providerKey").as[String]),
              Some((user \ "firstName").as[String]),
              Some((user \ "lastName").as[String]),
              Some((user \ "fullName").as[String]),
              Some((user \ "email").as[String]),
              Some((user \ "avatarUrl").as[String])
            )
          )
        })
      })
    })
  }
je veux que ça me renvoie juste un objet user, pas de Seqou autre
le map il renvoie une seq non ?
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:13
Le map de response il renvoie soit la une future soit l'objet je sais pas trop
Mais c'est logique d'avoir un Seq
C'est le \\ qui cause ça
Tu as commité déjà ?
Nicolas Joseph
@callicles
Jun 21 2015 17:14
non
je sais que c’est normal d’avoir des seq
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:14
Tu devrais même presque avoir un seq de seq de seq non ?
Nicolas Joseph
@callicles
Jun 21 2015 17:14
c’est le cas
mais c’est pas ce que je veux
a mais avec un flatMap
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:15
Déjà transforme le map en flatMap
Ah
Nicolas Joseph
@callicles
Jun 21 2015 17:15
:)
si je fait que des flatMap ça devrait le faire je pense
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:15
Juste 1 flatmap
Celui du haut
Nicolas Joseph
@callicles
Jun 21 2015 17:17
la je renvoie plus rien du coup
à cause du fait que ce soit des forEach partout
mais avec un yield
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:18
Oui fais des map
à la place des foreach
Nicolas Joseph
@callicles
Jun 21 2015 17:19
bah non plus ça va me faire Seq de Seq
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:19
Non y'a le flatMap avant qui va faire son boulot
Nicolas Joseph
@callicles
Jun 21 2015 17:19
il applati qu’une fois le flat Map non ?
en tout cas idea est pas content
et me dit que ça va faire des Seq de Seq
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:20
Oui en effet
Mais une for comprehension devrait le faire en fait non ?
Nicolas Joseph
@callicles
Jun 21 2015 17:21
je t’écoute
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:23
for (reponse <- request;
         val neoResp = Json.parse(response.body)
         result <- (neoResp \\ "results");
         data <- (result \\ "data");
         user <- (data \\ "row")) yield User....
Et ça fera une combinaison de map et flatMap comme il faut
Nicolas Joseph
@callicles
Jun 21 2015 17:24
ça a l’air pas mal, je vais regader ça
Nicolas Joseph
@callicles
Jun 21 2015 17:32
merci
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:36
Ça marche ?
Nicolas Joseph
@callicles
Jun 21 2015 17:37
je sais pas encore si ça fonctionne mais déjà il rale plus
je porte ça sur l’autre finder
et je test
si ça fonctionne je commit
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:40
Ok cool
Nicolas Joseph
@callicles
Jun 21 2015 17:42
bon j’ai le compilo qui est pas content
  def parseNeoUser(res: Future[WSResponse]) ={
    for(response <- res; neoResp = Json.parse(response.body); result <- neoResp \\ "results"; data <- result \\ "data"; user <- data \\ "row")
      yield User(
        UUID.fromString((user \ "userID").as[String]),
        LoginInfo((user \ "loginInfo" \ "providerID").as[String], (user \ "loginInfo" \ "providerKey").as[String]),
        Some((user \ "firstName").as[String]),
        Some((user \ "lastName").as[String]),
        Some((user \ "fullName").as[String]),
        Some((user \ "email").as[String]),
        Some((user \ "avatarUrl").as[String])
      )
  }
[error] /Users/nicolasJ/Code/gitrank-web/app/models/daos/UserDAOImpl.scala:98: Cannot find an implicit ExecutionContext. You might pass
[error] an (implicit ec: ExecutionContext) parameter to your method
[error] or import scala.concurrent.ExecutionContext.Implicits.global.
[error]     for(response <- res; neoResp = Json.parse(response.body); result <- neoResp \\ "results"; data <- result \\ "data"; user <- data \\ "row")
[error]                  ^
[error] /Users/nicolasJ/Code/gitrank-web/app/models/daos/UserDAOImpl.scala:98: value \\ is not a member of Any
[error]     for(response <- res; neoResp = Json.parse(response.body); result <- neoResp \\ "results"; data <- result \\ "data"; user <- data \\ "row")
[error]                                                                                 ^
[error] /Users/nicolasJ/Code/gitrank-web/app/models/daos/UserDAOImpl.scala:44: No Json serializer found for type com.mohiva.play.silhouette.api.LoginInfo.type. Try to implement an implicit Writes or Format for this type.
[error]             "LoginInfo" -> Json.stringify(Json.toJson(LoginInfo))
[error]                                                      ^
[error] /Users/nicolasJ/Code/gitrank-web/app/models/daos/UserDAOImpl.scala:62: No Json serializer found for type scala.collection.immutable.Map[String,Object]. Try to implement an implicit Writes or Format for this type.
[error]         Json.toJson(Map(
[error]                    ^
[error] /Users/nicolasJ/Code/gitrank-web/app/models/daos/UserDAOImpl.scala:89: Cannot find an implicit ExecutionContext. You might pass
[error] an (implicit ec: ExecutionContext) parameter to your method
[error] or import scala.concurrent.ExecutionContext.Implicits.global.
[error]     )).map(response => {
[error]           ^
[error] 5 errors found
[error] (compile:compileIncremental) Compilation failed
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:47
Déjà ajoute le import scala.concurrent.ExecutionContext.Implicits.global pour que tes Futures puissent marcher
Les autres sont assez claires
Il sait pas sérialiser LoginIngo en json
Nicolas Joseph
@callicles
Jun 21 2015 17:48
ok
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:52
Et vérifie qu'il y a pas besoin de parenthèses autour de neoResp \\ "results"
Mais je suppose que non si tu les as enlevées
Nicolas Joseph
@callicles
Jun 21 2015 17:54
[error] /Users/nicolasJ/Code/gitrank-web/app/models/daos/UserDAOImpl.scala:99: type mismatch;
[error]  found   : Seq[models.User]
[error]  required: scala.concurrent.Future[?]
[error]     for(response <- res; neoResp = Json.parse(response.body); result <- neoResp \\ "results"; data <- result \\ "data"; user <- data \\ "row")
[error]                                                                      ^
[error] /Users/nicolasJ/Code/gitrank-web/app/models/daos/UserDAOImpl.scala:42: No Json serializer found for type scala.collection.immutable.Map[String,Object]. Try to implement an implicit Writes or Format for this type.
[error]         Json.toJson(Map(
[error]                    ^
[error] /Users/nicolasJ/Code/gitrank-web/app/models/daos/UserDAOImpl.scala:63: No Json serializer found for type scala.collection.immutable.Map[String,Object]. Try to implement an implicit Writes or Format for this type.
[error]         Json.toJson(Map(
[error]                    ^
[error] three errors found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 3 s, completed 21 juin 2015 19:54:23
Jacob Tardieu
@jacobtardieu
Jun 21 2015 17:59
Ah attends
res c'est une future ?
Et pas de bol pour toi il sait pas désérialiser Map[String, Object] ce qui paraît logique
Je sais pas comment est ton code mais pour désérialiser précise exactement le type que tu veux, par exemple Map[String, String]
Pour info les for comprehension ne sont pas capables de traiter plusieurs types de monades
Donc si tu as une future en premier il ne sait traiter que des futures ensuite
(idem pour les options)
Donc tu vas être obligé de sortir response <- res; neoResp = Json.parse(response.body) de la for comprehension et de le mettre dans une map
Jacob Tardieu
@jacobtardieu
Jun 21 2015 18:09
Moi j'y vais, si d'autres pb tu peux demander je répondrai plus tard
Nicolas Joseph
@callicles
Jun 21 2015 18:10
res c’est une Future
ok
Jacob Tardieu
@jacobtardieu
Jun 21 2015 18:11
Ouais dors là de la for et ça devrait aller
Thomas
@pocman
Jun 21 2015 18:50
Ça a l'air rigolo ce que vous dites.
Hehe. Moi au boulot je p
Nicolas Joseph
@callicles
Jun 21 2015 18:50
?
je p ?
Thomas
@pocman
Jun 21 2015 18:50
Me prend la tête avec des map sur des object extrait via slick
Intellij utilisé un coeur pour faire l'inférence de type en permanence avec cette saloperie
Pour le docker, je l'ai mis sur Master donc faut vraiment plus faire que des merges histoire de pas rebuild à chaque fois l'image
Nicolas Joseph
@callicles
Jun 21 2015 18:53
bah on s’en fous non ? que ça rebuild
je travaille sur developpe
mais le serveur de test on voudra qu’il deploie developp non ?
Thomas
@pocman
Jun 21 2015 19:24
Idéalement il faudra un branche staging
Ou alors on merge aussi dans develop
Le problème c'est que ça rallonge pas mal le temps de test sur circle
Nicolas Joseph
@callicles
Jun 21 2015 19:26
ok
Nicolas Joseph
@callicles
Jun 21 2015 21:37
Json.obj(
              "userID" -> user.userID.toString,
              "loginInfo" -> Json.stringify(Json.toJson(user.loginInfo)),
              "fullName" -> user.fullName,
              "email" -> user.email,
              "avatarUrl" -> user.avatarURL
            )
J’ai des fields qui peuvent potentielement être null, comment je peut generer un objet json qu’avec les champs definis dans la classe user ?
Jacob Tardieu
@jacobtardieu
Jun 21 2015 22:06
Le mieux c'est que tu définisses un Writes sur ta case class User
Si tu met dans l'objet compagnon de User un truc dans le genre :
implicit val residentWrites: Writes[Resident] = (
  (JsPath \ "name").write[String] and
  (JsPath \ "age").write[Int] and
  (JsPath \ "role").writeNullable[String]
)(unlift(Resident.unapply))
writeNullable permet d'écrire une option
Nicolas Joseph
@callicles
Jun 21 2015 22:12
ok merci