Skip to content

Instantly share code, notes, and snippets.

Avatar

Komlan Akpédjé KEDJI erickedji

View GitHub Profile
@erickedji
erickedji / sparkJsonSchemaToStructTypeSource.js
Created Mar 30, 2021
Get spark DataFrame inferred schema with schema.json(), then use this to convert it to scala source (StructType, etc.)
View sparkJsonSchemaToStructTypeSource.js
// https://github.com/apache/spark/blob/0494dc90af48ce7da0625485a4dc6917a244d580/sql/catalyst/src/main/scala/org/apache/spark/sql/types/DataType.scala#L200
function sparkJsonSchemaToStructTypeSource(json) {
const types = ["string", "long", "double", "float", "boolean"];
if (typeof json === "string")
return `${json[0].toUpperCase()}${json.slice(1)}Type`;
switch (json.type) {
case "array":
@erickedji
erickedji / clean-gsmarena-data.js
Created Mar 15, 2019
Script de traitement du dataset gsmarena de kaggle pour brain.js
View clean-gsmarena-data.js
const fs = require("fs")
const parse = require("csv-parse")
const fileName = "gsmarena-phone-dataset.csv"
const fileContent = fs.readFileSync(fileName).toString()
parse(fileContent, {
columns: true,
skip_lines_with_error: true,
skip_empty_lines: true
}, function (err, records) {
View 05-learn-phone-price.js
const { loadOrTrain } = require("./utils")
const brain = require("brain.js")
const trainingData = require("./selectra-phone-dataset-numbers-only-normalized.json");
const net = new brain.NeuralNetwork({ hiddenLayers: [3] });
const stats = net.train(trainingData);
// const stats = loadOrTrain(net, trainingData);
View selectra-phone-dataset-numbers-only-normalized.json
[
{
"input": {
"Processeur": 1,
"Mémoire vive (RAM)": 0.3333333333333333,
"Mémoire interne": 1,
"Poids": 0.7326732673267327,
"Appareil photo frontal": 0.4375,
"Autonomie": 0.5058333333333334,
"Écran": 0.4506756756756757
View extract-phone-dataset-from-selectra.info.js
https://selectra.info/telecom/guides/comparatifs/telephones-mobiles
function getPhoneData(tableDivEl) {
try {
let rawData = Array.from(tableDivEl.querySelectorAll("tr"))
.map(tr => ({
key: tr.querySelector("th").textContent,
value: parseInt(tr
.querySelector("td")
.textContent
@erickedji
erickedji / updateIncludes.js
Last active Oct 5, 2015
Statically process file includes for a set of html files, using underscore's template function (idempotent in-place update)
View updateIncludes.js
#!/usr/bin/env node
"use strict";
// This script will search for HTML files on the root folder and process
// static includes wrapped by the HTML comments like this:
//
// <!-- #include "foo.html" -->
// anything wrapped by these comments will be replaced
// by the content of the "partialsDir/foo.html" file
// <!-- endinclude -->
View upgrading passwords.js
// How to upgrade your users passwords in the DB without their intervention
//
// SHA-1 isn't strong enough to hash passwords with, but lots of people have a
// whole bunch of SHA-1'd passwords because they thought it was. You could use
// bcrypt or scrypt, but maybe in two years' time someone will tell you that's
// also not strong enough, and you'll want to upgrade.
//
// This sample demonstrates how you can remove weak password hashes from your
// user database, without needing the user to enter their password.
@erickedji
erickedji / exo10p24_select.c
Created Nov 16, 2011
Exercices de la séance 5 - TP Systèmes Centralisés
View exo10p24_select.c
/* Time-Stamp: <16 Oct 1997 12:42 charpov@enseeiht.fr> */
/* 8.9 */
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/time.h>
#include <string.h>
#include <stdlib.h>
@erickedji
erickedji / Note sur la fermeture des descripteurs de fichiers.md
Created Nov 9, 2011
Exercices de la séance 4 - TP Systèmes Centralisés
View Note sur la fermeture des descripteurs de fichiers.md

Quand un pipe est ouvert, et que le descripteur associé à un bout d'écriture (desc[1]) reste ouvert dans un processus, le système attendra que ce processus ferme ce descripteur (après y avoir éventuellement écrit), pour signifier qu'il a fini d'y écrire.

Conséquence: Quand on créé des processus fils, ou qu'on duplique des descripteurs, il faut fermer systématiquement tous ceux qu'on n'utilise pas dans le processus courant.

En TP, sur certaines machines, pour l'exercice 3, les deux pipes p et q étaient créés dès l'entrée dans le programme principal (pipe(p); pipe(q);). Or, seul le pipe p a été fermé ensuite dans le programme principal, ce qui fait que le système est toujours en attente d'écriture sur q[1] (d'où la non terminaison constatée chez certains).

Il faut soit fermer explicitement le pipe q (utilisé pour la communication entre le fils et le petit-fils) dans le programme principal (père), ou créer ce pipe seulement dans le fils.

Pour rappel, en TP, on avait deux pipes p et q, et tr

@erickedji
erickedji / appli_fork_exec_wait2.2.8.c
Created Nov 8, 2011
Exercices de la séance 3 - TP Systèmes centralisés
View appli_fork_exec_wait2.2.8.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
int n, ret;