Chez Neos-SDI, on fête le foot !

Après un tournoi de foot FIFA18 bien sympa, on a fêté le vainqueur ! C’est Jean-Mimi notre expert CRM (for ever) qui a gagné.

Si vous cherchez une société innovante avec des qualités humaines certaines, dans laquelle l’ambiance est bien sympa, venez chez Neos-SDI !

Contact : http://www.neos-sdi.com/recrutement

Pic_Bières

La photo a été prise par notre admin-système Jean-Remy qui va bientôt nous faire son premier article technique…

 

Les US Rangers de l’US Army

La devise des Rangers : “Rangers lead the way” => “Les Rangers ouvrent la voie”

Le serment du Ranger:

Reconizing that I volunteered as a Ranger, fully knowing the hazards of my chosen profession, I will always endeavor to uphold the prestige, honor, and high esprit de corps of my Ranger Regiment.

Reconnaissant m’être engagé en tant que ranger, en ayant une parfaite connaissance des dangers de ma profession, je m’efforcerai de toujours faire respecter le prestige, l’honneur et l’esprit de corps des rangers.

Acknowledging the fact that a Ranger is a more elite soldier who arrives at the cutting edge of battle by land, sea, or air, I accept the fact that as a Ranger my country expects me to move farther, faster and fight harder than any other soldier.

Je reconnais qu’un ranger est un soldat d’élite qui arrive sur le terrain au moment critique, par voie aérienne, maritime ou terrestre, qui doit donc toujours être plus rapide, se battre plus dur et plus longtemps, que tout autre soldat pour son pays.

Never shall I fail my comrades. I will always keep myself mentally alert, physically strong and morally straight and I will shoulder more than my share of the task whatever it may be. One-hundred-percent and then some.

Je ne dois jamais laisser tomber mes camarades. Je serai toujours à l’affût mentalement, fort physiquement, droit moralement et j’en ferai toujours plus que ma part de travail, quel qu’il soit. A cent pourcent et encore un peu plus.

Gallantly will I show the world that I am a specially selected and well-trained soldier. My courtesy to superior officers, neatness of dress and care of equipment shall set the example for others to follow.

Je montrerais noblement au monde que je suis spécialement sélectionné et un soldat bien entrainé. Ma courtoisie envers mes supérieurs, mon port parfait de l’uniforme et le soin que j’apporte à l’équipement doivent servir d’exemple à suivre aux autres

Energetically will I meet the enemies of my country. I shall defeat them on the field of battle for I am better trained and will fight with all my might. Surrender is not a Ranger word. I will never leave a fallen comrade to fall into the hands of the enemy and under no circumstances will I ever embarrass my country.

J’affronterai les ennemis de mon pays avec ferveur. Je dois les vaincre sur le champ de bataille car je suis mieux entrainé et me battrait avec toutes mes forces. Se rendre n’est pas un mot « ranger ». Je ne laisserai jamais tomber un camarade entre les mains des ennemis, et en aucun cas je ne ferai de tort à mon pays.

Readily will I display the intestinal fortitude required to fight on to the Ranger objective and complete the mission though I be the lone survivor.

Je donnerai tout ce que j’ai pour servir mon pays avec les rangers, pour accomplir ma mission, et même si je devais être l’unique survivant.

Rangers lead the way!

Les rangers ouvrent la voie !

Comment wrapper la base NoSQL OpenLDAP-LMDB

C’est très simple… Il suffit d’encapsuler les types C de base de la lib et les routines Get/Set. Voici le header:

#pragma once
#include "LMDBWindowsDll.h" 
#include "lmdb-dll.h"
#include "midl-dll.h"

class LMDBWRAPPER_API LMDBData
{
public:
	LMDBData();
	virtual ~LMDBData();

public:
	bool m_Init = false;
	MDB_env * m_env;
	MDB_dbi m_dbi;
	MDB_txn * m_txn;
};


// This class is exported from the LMDBWrapper.dll
class LMDBWRAPPER_API CLMDBWrapper {	
public:
	CLMDBWrapper(void) { }
	~CLMDBWrapper() { }

	bool Init(LPSTR lpszDbName);
	bool Uninit(LPSTR lpszDbName);
	bool SetData(LPSTR lpszKey, LPSTR lpszValue);
	bool SetData(LPSTR lpszKey, LPSTR lpszValue, DWORD dwLen);
	bool GetData(LPSTR lpszKey, LPSTR lpszValue);

private:
	LMDBData m_lmdb;
};

extern LMDBWRAPPER_API int nLMDBWrapper;

LMDBWRAPPER_API int fnLMDBWrapper(void);

On y trouve une structure avec différents éléments comme l’environnement, la connexion et la transaction… Regardons le corps de la classe CLMDBWrapper:

#include "header.h"
#include "..\Include\LMDBWrapper.h"
#include "..\Include\CWrapper.h"
#include "..\Include\LMDBWrapper.h"
#include "..\Include\MyServer\Constants.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


LMDBData::LMDBData()
{
	m_dbi = 0;
	m_env = nullptr;
	m_txn = nullptr;
}

LMDBData::~LMDBData()
{
}


bool CLMDBWrapper::Init(LPSTR lpszDbName)
{
	char sz[255];

	sprintf_s(sz, "%s\\%s", Constants::LMDBRootPath.c_str(), lpszDbName);
	::CreateDirectoryA(sz, NULL);

	std::wcout << _T("Init LMDB") << std::endl;
	mdb_env_create(&m_lmdb.m_env);
	mdb_env_set_maxreaders(m_lmdb.m_env, 1);
	mdb_env_set_mapsize(m_lmdb.m_env, 10485760);
	mdb_env_open(m_lmdb.m_env, sz, MDB_CREATE/*|MDB_NOSYNC*/, 0664);

	m_lmdb.m_Init = true;
	return true;
}

bool CLMDBWrapper::Uninit(LPSTR lpszDbName)
{
	std::wcout << _T("Uninit LMDB") << std::endl;

	mdb_dbi_close(m_lmdb.m_env, m_lmdb.m_dbi);
	mdb_env_close(m_lmdb.m_env);

	m_lmdb.m_dbi = 0;
	m_lmdb.m_env = nullptr;
	m_lmdb.m_txn = nullptr;
	m_lmdb.m_Init = false;
		
	return true;
}

bool CLMDBWrapper::SetData(LPSTR lpszKey, LPSTR lpszValue)
{
	if (m_lmdb.m_Init == false)
	{
		std::wcout << _T("Init not done !") << std::endl;
		return false;
	}

	char szKey[255];
	char szValue[255];

	strcpy(szKey, lpszKey);
	strcpy(szValue, lpszValue);

	MDB_val VKey;
	MDB_val VData;

	VKey.mv_size = sizeof(szKey);
	VKey.mv_data = szKey;
	VData.mv_size = sizeof(szValue);
	VData.mv_data = szValue;
	//_tprintf(_T("Add Key:%s Data:%s\n"), szKey, szValue);
	mdb_txn_begin(m_lmdb.m_env, NULL, 0, &m_lmdb.m_txn);
	mdb_dbi_open(m_lmdb.m_txn, NULL, 0, &m_lmdb.m_dbi);
	mdb_put(m_lmdb.m_txn, m_lmdb.m_dbi, &VKey, &VData, MDB_NOOVERWRITE);
	mdb_txn_commit(m_lmdb.m_txn);

	return true;
}

bool CLMDBWrapper::SetData(LPSTR lpszKey, LPSTR lpszValueb64, DWORD dwLen)
{
	return true;
}

bool CLMDBWrapper::GetData(LPSTR lpszKey, LPSTR lpszValue)
{
	if (m_lmdb.m_Init == false)
	{
		std::wcout << _T("Init not done !") << std::endl;
		return false;
	}

	char szKey[255];
	char szValue[255];

	strcpy(szKey, lpszKey);
	strcpy(szValue, "");

	MDB_val VKey;
	MDB_val VData;

	VKey.mv_size = sizeof(szKey);
	VKey.mv_data = szKey;
	
	mdb_txn_begin(m_lmdb.m_env, NULL, 0, &m_lmdb.m_txn);
	mdb_dbi_open(m_lmdb.m_txn, NULL, 0, &m_lmdb.m_dbi);
	int err = mdb_get(m_lmdb.m_txn, m_lmdb.m_dbi, &VKey, &VData);
	//printf("Get Key:%s Data:%s\n", VKey.mv_data, VData.mv_data);
	mdb_txn_commit(m_lmdb.m_txn);

	if (err == MDB_NOTFOUND)
	{
		strcpy(lpszValue, "");
	}
	else
	{
		strcpy(lpszValue, (char *)VData.mv_data);
	}

	return true;
}

 

Bienvenue à un Admin-Système

Jean-Rémy D. vient de nous rejoindre. Il est admin-système chez Neos-SDI. L’infra c’est lui, Powershell, l’AD, les masters, le wifi, les backups, bref l’infra que tous les employés de Neos-SDI utilise, c’est lui ! Et ça ronronne. Il n’est pas copain avec le C (c’est lui qui le dit) mais il pratique le Powershell au quotidien ! Jean-Rémy est toujours étudiant mais il ne demande qu’à apprendre.

La troupe Infra s’agrandit avec Jean-Baptiste, Cédric et maintenant Jean-Rémy.

Sans les gars du système et de l’infrastructure, on ne pourrait pas bosser donc il vaut mieux les avoir dans la poche… ! 🙂

Les .NET Rangers ont 3 MVP

Nous avons ouvert le concept des Rangers à tous les produits et technologies Microsoft et même un peu plus, avec notre expert Bitcoin et développeur Go (Michel) et notre Architecte d’Entreprise (Jean-Noël) qui sont aussi des bons connaisseurs de la plateforme MS.

Mais nous avons aussi du lourd sur les technologies Microsoft avec 3 MVP:

 

MVP_Logo_Horizontal_Preferred_Cyan300_RGB_300ppi

Quand le code est clair, même le C++ est easy…

Voici la méthode GET de mon serveur HTTP REST fait en C++:

Il suffit d’extracter la variable request et le tour est joué… L’avantage du C++ c’est que le code généré est tellement efficace qu’il consomme peu de mémoire et est d’une rapidité extrème surtout en Release x64. Et ce n’est pas plus difficile que le C# ou le Java…

void MyServer::handle_get(http_request message)
{
	std::wcout << _T("handle_get") << std::endl;
	std::wcout << _T("Message") << _T(" ") << message.to_string() << endl;
	std::wcout << _T("Relative URI") << _T(" ") << message.relative_uri().to_string() << endl;

	auto paths = uri::split_path(uri::decode(message.relative_uri().path()));
	for (auto it1 = paths.begin(); it1 != paths.end(); it1++)
	{
		std::wcout << _T("Path") << _T(" ") << *it1 << endl;
	}

	auto query = uri::split_query(uri::decode(message.relative_uri().query()));
	for (auto it2 = query.begin(); it2 != query.end(); it2++)
	{
		std::wcout << _T("Query") << _T(" ") << it2->first << _T(" ") << it2->second << endl;
	}

	std::wstring request = CHelper::FindParameterInQuery(query, _T("request"));
	std::wstring server = CHelper::FindParameterInQuery(query, _T("server"));
	std::wstring port = CHelper::FindParameterInQuery(query, _T("port"));
	std::wstring name = CHelper::FindParameterInQuery(query, _T("name"));
	std::wstring dbname = CHelper::FindParameterInQuery(query, _T("dbname"));

	if (request == _VERB_REGISTER_NODE_)
	{
		std::wcout << _VERB_REGISTER_NODE_ << std::endl;

		if (MyServer::ExistsNode(server, port, name) == true)
		{
			std::wcout << _T("Node already registered !") << std::endl;
		}
		else
		{
			std::shared_ptr<WorkerNodeAttributes> pNode = std::make_shared<WorkerNodeAttributes>();
			pNode->_server = server;
			pNode->_port = port;
			pNode->_name = name;
			pNode->_dbName = _T("");

			g_Guard.WaitToWrite();
			_nodes.push_back(pNode);
			std::wcout << _T("Node registered !") << _T(" count: ") << _nodes.size() << std::endl;
			g_Guard.Done();
		}

		message.reply(status_codes::OK);
		return;
	}
		
	if (request == _VERB_SHOW_NODE_)
	{
		std::wcout << _VERB_SHOW_NODE_ << std::endl;
		MyServer::ShowNodes();
		message.reply(status_codes::OK);
		return;
	}
	
	if (request == _VERB_GET_NODE_ )
	{
		std::wcout << _VERB_GET_NODE_ << std::endl;
			
		std::shared_ptr<WorkerNodeAttributes> pObj = nullptr;

		g_Guard.WaitToWrite();

		for (auto itr = _nodes.begin(); itr != _nodes.end(); itr++)
		{
			pObj = *itr;

			if (pObj->_dbName == dbname) // && pObj->_isActive == true
			{
				// We find an existing entry
				*itr = pObj;
				break;
			}
			else if (pObj->_isActive == false)
			{
				// We find an entry
				pObj->_isActive = true;
				pObj->_dbName = dbname;
				*itr = pObj;
				break;
			}
			else
				pObj = nullptr;
		}
				
		if (pObj != nullptr)
		{
			GetNodeData data;
			data.ip = pObj->_server;
			data.port = pObj->_port;
			data.name = pObj->_name;
			data.dbName = dbname;

			std::wstring response = data.AsJSON().serialize();
			std::wcout << response << endl;

			message.reply(status_codes::OK, data.AsJSON());

			MyServer::SendDbName(data);
		}
		else
		{
			std::wcout << _T("No node available...") << std::endl;
			message.reply(status_codes::OK);
		}

		g_Guard.Done();

		return;
	}
		
	message.reply(status_codes::OK);
};

 

Suivez-nous sur Twitter @RangersNet

Notre compte twitter .NET Rangers utilise TweetDeck ce qui permet aux membres ayant déjà un compte twitter de tweeter sous le nom des .NET Rangers.

Ansi, tout le monde blog dans son univers. Mon ami Keelan (@KeelanClech) va nous retweeter pleins d’évènements de sa boutique Sogeti et Cédric (@enovatic) va nous parler de Windows Server et d’infra et de cloud. Et Frédo va nous expliquer comment il transforme son appz client lourd C Win32 en C++ MFC et une lib tierce de BCGSoft.

Allez, bons tweets ! Et vive les Rangers !

RGPD – nous avons aussi un Expert !

Si vous en doutiez encore la protection des données est au coeur de l’action de nos politiques adorés.

D’abord, ça fait parler, ça brasse du vent, parce que, il faut bien le dire, tout le monde s’en fout et les pop-up on en a marre…

A – On s’en fout

Donc c’est un sujet à la mode, facile pour nos politiciens et pour les think tanks.

Ben voila, les DotNetRangers ont aussi leur expert CNIL, un CIL quoi, de profession, depuis plusieurs années et qui a même participé à des réunions rue Vivienne, à la CNIL.

Si si. Et qu’a-t-il fait cet homme ?

Il a cartographié le SI d’une grande banque aux fins de mise en conformité du système d’information,  mais également mis à jour les documents types pour les appels d’offres européens ou pas d’un grand compte bancaire central (je vous ai mis sur la voie là !)

Et conseillé des dizaines de petites boites où les déclarations normales simplifiées suffisaient. Les NS46,47,48 pour ceux qui veulent comprendre couvrent 90% des besoins des PME et se déclarent en 3 fois 10 minutes.

Avec 10 millions de sociétés en France on aurait du avoir 30 millions de NS46/47/48, au bas mot… mais les numéros de déclaration était en dessus de 2 millions…. donc tout le monde s’en fout !

B – Les pop-up, on en a marre !

Par contre qu’est ce qu’on en entend parler ! HADOPI 1 puis HADOPI 2, les lois sur le piratage qui promettaient d’envoyer un bad cop à la Chuck NORRIS chez vous pour vous interdire d’aller sur MegaUpload, zone-telechargement et autres pinknets, darknets, etc etc.

C’est sûr on préfère voir les français poster sur jackieetmichel des films de travers filmés en GoPro… ça ça fait vendre.

De toutes manières, on a coupé la robinetterie des euros à l’HADOPI.

Fallait trouver autre chose ! Occuper la scène ! Lancer un bon gros troll bien visible.

Et RGPD ca sonne bien….personne ne sait ce que c’est mais un trigramme de 4 lettres, ça cause grave.

  • Vous faites quoi dans la vie ?
  • RGPD.
  • Ah oui, quand même !

Bon. Mais en vrai ? à part des pop-up ? Rien.

Conclusion : Toujours un coup d’avance : la RGPD, demandez notre expert !

Par contre sur le CV, ça cause. La RGPD sera opérationnelle demain le 25 mai et comme les DotNetRangers ont toujours un coup d’avance, notre expert à  déjà ben, voyons 2008 moins 2018, bididi bididi badabada, ben DIX ans d’expérience sur le sujet.  Tout pile. Incroyable non ?

On va donc le facturer l’gars façon SSII (ou ESN !) en mode RGPD profil “sénior” sans la CSG, celà va de soi.

Appelez-nous ! Prix d’ami garanti.

 

 

 

Le logo et les premiers membres

NETRangers

La communauté technique des .NET Rangers accueille des anciens membres Sogeti mais aussi des nouveaux et tout particulièrement des experts qui ne font pas de développement mais de l’infrastructure.

Comme dit JBB, à l’heure du DevOps, pourquoi dissocier apps et infra ?

Membres au 24/5: (updated !)

  • Jean-Baptiste B. – Sogeti/Cap Gemini – Région EST Strasbourg
  • Cédric G. – Sogeti/Cap Gemini – Région EST Strasbourg
  • Jean-Nicolas B. – Sogeti – Lyon
  • Guilhem M. – C-S – Toulouse
  • Cédric T. – Sogeti/Cap Gemini – Lyon
  • Keelan C. – Sogeti/Cap Gemini – Lyon
  • Eva D. – Neos-SDI – Paris
  • Frederic S. – Sydev – Précy sous Thil
  • Michel F. – Indépendant – Paris
  • Jean-Noël G. – Prymarys – Dijon
  • et moi, Christophe P. – Neos-SDI – Paris

Une fois que nous serons une petite dizaine de membres, il y aura une page membres avec une petite bio pour chacun. Pour le moment, la communauté se forme.

On est “under construction” ! Stay tuned !

Démarrage…

La notion de .NET Rangers date de 2010 et est le fruit d’une intiative de François MERAND pour la société Sogeti. Cette communauté comptait un noyau dur de consultants expérimentés sur le développement avec les technologies Microsoft .NET Framework.

Un Ranger est un expert communiquant : il possède un blog ou un site web, il fait des articles technique, il est speaker sur des évènements et il cherche à rester “on the edge”.

Les .NET Rangers v1 sont morts, vive les Rangers v2. Quels sont les changements ?

  • .NET Rangers n’est plus associé à Sogeti
  • C’est une communauté technique, une association où l’on partage des choses
  • Les membres ne font pas que du développement
    • il y a de l’infrastructure , du cloud et de la sécurité

Etre membre, ça oblige à quoi ? => A rien, vous recevez une invitation à être bloggeur (Author) sur le site wordpress et vous échangez ce que vous voulez et quand vous le voulez.

Si vous êtes partant, écrivez-moi !

christophepichaud@hotmail.com

MVP_blue