« first day (1197 days earlier)      last day (1912 days later) » 

4:03 PM
^^^@Pikoh y @Trauma si quieren jugar.. hay que ver porque copia un solo caracter!
 
4:16 PM
@gbianchi @Trauma estaba ansioso por saber de ti y tus pruebas, pero los viernes se va a casa antes
8 hours ago, by Trauma
Hablando de C# ... ¿ por donde andará @gbianchi ? A ver como lleva la prueba de concepto de anoche :-)
8 hours ago, by Trauma
@Pikoh joer ... toy deseando que me cuente como le fué O_o
8 hours ago, by Trauma
¿ Me dejará con la intriga todo el finde ?
 
Phi
4:42 PM
@gbianchi ¿sabes Git Flow?
 
hace 8 horas eran las 7 AM!!!! mi dios.. dormia... jajaja
@PabloLozano y bueno.. veremos despues del finde que surge...
@Phi desconozco...
 
Ya pude compilar MonoDevelop sin errores, me quedaron 328 advertencias. Tuve que abrir Visual Studio como administrador porque un archivo de FSharp Shared no se podía escribir. gist.github.com/ArtEze/08e0434e1634182adb7aa0a717971c3d
 
@ArtEze yo sigo sin entender porque queres compilar otra IDE, cuando MS te da dos ides sin problemas para trabajar.. Y menor pq si ya estas usando una, queres usar otra.. pero.. bien por vos :)
 
Phi
@gbianchi oye, me falta la Mixed_Mode_Debugging.dll
 
@Phi cuando compilas aparece.. estan las dos en el proyecto
vas a tener que modificar la ruta a la misma...
 
4:51 PM
@gbianchi Voy a probar los dos, quizás MonoDevelop me va más rápido en esta netbook.
Bueno, los tres, podría probar el de Xamarin también.
 
Eso es algo que me gusta de Java: el que compile o no, no depende del IDE porque los archivos de configuración son agnósticos
 
El único que creo que no compiló fue el po.mdproj, que se encarga ade las traducciones. Lo cambié a csproj pero sigue igual.
 
Phi
@gbianchi bah, me aparece un error en mi VS que no encuentra String.h
esa pregunta solo nos ha traído más problemas que soluciones
 
Yo siempre busco los dll con el Everything.
 
Phi
5:08 PM
LOL, return to <inherit from parent or project defaults> save changes, and then return again to version 10 worked for me — Phi 3 mins ago
@gbianchi el código del repo no es el mismo que Trauma puso en su pregunta, ¿cierto? porque no le veo nada parecido, jaja
 
5:31 PM
¡ @gbianchi ! ¡ Ya estoy aquí !
Que bien me ha sentado la siesta :-D
 
Phi
@Trauma ya pude echar a andar el proyecto que preparó Gonzalo, pero tengo dudas con el código de C++
 
@Phi ¿ Que paso ? ¿ Que cadena/s saca ?
¡ Vamos hombre ! ¡ Que a las 20:00 tengo que llevar al niño a un cumpleaños ! ¡ No me dejes así !
 
Phi
@Trauma este código:
 
:-(
 
Phi
__declspec(dllexport) int __stdcall mixed_mode_multiply(wchar_t *buff, int length) {
		char *destino = reinterpret_cast<char *>(buff);
		*destino = 0;
		const wchar_t *cadena1 = L"1esta es una cadena1";
		const  wchar_t* cadena2 = L"2esta es una cadena2";
		const  wchar_t* cadena3 = L"3esta es una cadena3";
		const  wchar_t* cadena4 = L"4esta es una cadena4";
		strncpy(destino, (const char *)cadena1, wcslen(cadena1) * sizeof(wchar_t));
		return 0;
	}
solo saca el primer caracter
 
5:35 PM
@Phi Pero, sin embargo, copia la cadena1 completa
 
Phi
@Trauma debería, pero no
 
nonono
 
Phi
haciendo debug, solo copia el primer char
 
ese no es el último código que dijimos ayer
ese es el original de la respuesta, que copia utf-8 en una cadena wchar_t
ese no sirve
 
Phi
osh...
fue el que me pasó @gbianchi
ya no supe cuál fue el más reciente
 
5:36 PM
un segundo ... lo voy poniendo, pero línea a línea
__declspec(dllexport) int __stdcall mixed_mode_multiply(wchar_t *buff, int length) {
wchar_t *destino = buff;
const wchar_t *cadena1 = L"1esta es una cadena1";
const wchar_t* cadena2 = L"2esta es una cadena2";
const wchar_t* cadena3 = L"3esta es una cadena3";
const wchar_t* cadena4 = L"4esta es una cadena4";
strncpy(destino, cadena1, wcslen(cadena1) * sizeof(wchar_t));
return 0;
}
Es ese
El original da problemas porque esperaba caracteres de 8 bits
entonces, como realmente, eran de 32
paraba la copia al llegar al primer 0, que seria el 2 byte del primer caracter
Ese que he puesto debería sacarte la cadena1 completa
 
Phi
a ver, ahora mismo lo pruebo
 
Ok :-)
 
Phi
tiene errores :(
 
¿¿ como ??
 
Phi
Severity Code Description Project File Line Suppression State
Error (active) E0167 argument of type "wchar_t *" is incompatible with parameter of type "char *" Mixed_Mode_Debugging
Severity Code Description Project File Line Suppression State
Error (active) E0167 argument of type "const wchar_t *" is incompatible with parameter of type "const char *" Mixed_Mode_Debugging
 
5:40 PM
ah, si, ya,
strncpy debería ser
wcscpy
wcscpy( destino, cadena1 );
 
Phi
otro error, pero ahora diferente
Severity Code Description Project File Line Suppression State
Error (active) E0140 too many arguments in function call Mixed_Mode_Debugging
ah ok ok, ya veo
 
le sobraba el último argumento :-)
 
@Phi tenes que agregar a tu proyecto de c++ la ruta a las librerias...
 
@gbianchi ¡ hombre ! ¡ por fin apareces ! ;-p
 
@Trauma ajajajaj
a ver...
espera.. @Phi el codigo es otro porque es el mcve!
 
Phi
5:43 PM
@Trauma efectivamente, copia toda la cadena :D
 
@Phi Hombre de poca fe ... :-p
 
Phi
@gbianchi hice ahí una babosada y logré echarlo a andar
@Trauma jajaja, tengo que asegurarme. Ver para creer
 
bueno, ¿ seguimos ?
Ya copia 1 cadena
ahora, que copie las demas
 
porque hacemos esto?
destino += ((wcslen(cadena1) + 1) * sizeof(wchar_t));
esto arruina a destino...
 
@gbianchi oh ! cierto
destino += ( wcslen( cadena1 ) + 1 );
 
5:46 PM
@Trauma a ver.....
 
Phi
@gbianchi ¿eso dónde está?
 
¿ destino era wchar_t, no ?
 
@Trauma me lo hiciste cambiar alla arriba
 
¿ eso es un SI o un NO ? ¡ concreción, por favor !
que son temas serios
xD
 
@Trauma si..
 
5:47 PM
Ok
 
y me arruina la cadena sumar eso!
 
no puede ser
 
//char *destino = reinterpret_cast<char *>(buff);
wchar_t *destino = buff;
*destino = 0;
const wchar_t *cadena1 = L"1esta es una cadena1";
const wchar_t* cadena2 = L"2esta es una cadena2";
const wchar_t* cadena3 = L"3esta es una cadena3";
const wchar_t* cadena4 = L"4esta es una cadena4";
wcscpy(destino,cadena1);
//destino += ((wcslen(cadena1) + 1) * sizeof(wchar_t));
destino += (wcslen(cadena1) + 1);
wcscpy(destino, cadena2);
//destino += ((wcslen(cadena2) + 1) * sizeof(wchar_t));
destino += (wcslen(cadena2) + 1);
ese es el codigo..
y mira...
 
veo ...
Eso debería sacar las 2 cadenas, no ?
 
5:49 PM
@gbianchi tines que ver destino como bytes crudos, no como cadena
 
el 0 de separación engaña al ide
yo lo veo bien
no no, no destino, sino buff
ese tiene que verse como bytes crudos
eso va bien, yo creo que las ha copiado las 2
 
@Trauma nop.. sigue retornando solo un caracter.. como a OP.. el problema esta en otro lado.. definitivamente....
 
buenas...
 
si retorna solo 1 caracter, es porque C# está esperando char []
NO SE ENTERA de que es un wchar_t []
el marshalling ese de las narices, no está saliendo bien
 
5:53 PM
@Trauma es que no estan en el chunk del sb... es raro..
dame un ratito que pruebo algunas cosas y ya te grito..
 
@gbianchi espera ...
@gbianchi
75
A: C# Byte[] Byte array to Unicode string

xanatosFrom byte[] array to string var mystring = Encoding.Unicode.GetString(myarray); From string to byte[] var myarray2 = Encoding.Unicode.GetBytes(mystring);

intenta obteniendo un Byte[] del StringBuilder, y convirtiendo ese a cadena
 
@Trauma claro.. pero mi array no tiene eso..
 
¿ en C# ?
¿ al volver a C#, el buff pierde datos ?
 
salvo.. que haya muchos chunks.. dejame revisar eso del stringbuilder...
 
@gbianchi ¿¿ ??
 
5:56 PM
probe especificar otro length, porque siempre volvia en 1...
dame 10 min.. tomate un respiro.. y seguimos.. esto es interesante...
 
ya hemos visto que la parte de C++ estaba bien, allí si se copiaba todo
que cosa mas rara ...
 
si si.. o por lo menos una cadena completa... igual me devuelve un 1.. cuando deberia ser un 2 si estuviera pisando la cadena.. o sea.. me devuelve el primer caracter de la primera...
donde esta la otra.. y los otros caracteres.. no se.. pero en algun lado estan.. porque si bajo el length al crear el builder se rompe...
 
ni idea :-(
igual hay que cambiar algo en la declaración del extern, en C#
pero tal y como está es como ponía en la documentación
public class Win32API {
[DllImport("User32.Dll")]
public static extern void GetWindowText(int h, StringBuilder s,
int nMaxCount);
}
public class Window {
internal int h; // Internal handle to Window.
public String GetText() {
StringBuilder sb = new StringBuilder(256);
Win32API.GetWindowText(h, sb, sb.Capacity + 1);
return sb.ToString();
}
}
¡¡ @gbianchi !!
¡¡ Eso es !!
en la doc de GetWindowText, dice que usa char
ah, pues no
vaya chasco
¡¡¡ @gbianchi !!!
[DllImport(DLL_LOCATION, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
¿ CharSet.Ansi ?
¡¡ CharSet.Unicode !!
joer, y ni se C#, ni tengo un IDE para probarlo, que si no ...
 
6:16 PM
@Trauma a ver...
 
CharSet.Unicode
zampale eso
 
@Trauma seeeeeeeeeeeeee.. ahi veo la cadena entera... pero una sola...
 
@gbianchi ¡¡¡¡ TOMA YA !!!!
Vale, pues ya lo tenemos
ahora, 2 opciones
o añadimos una función en C++ para trocear el buffer
 
@Trauma no.. tengo solo una.. no esta trayendo la segunda al copiarla...
 
bueno, pues ya está. No se puede ... de esa forma :-)
vale, ya
en lugar de un 0 para separar
podemos usar un \n
 
6:21 PM
esperaaaaaaaaa...
 
¡¡ no puedo !!
 
ya encontre algo.. estamos moviendo mal el puntero en c++
 
xDDD
@gbianchi ¿¿ perdona ??
¿¿insinuas que yo me he equivocado ??
 
@Trauma sip :p
y es mas.. puedo devolver la cadena entera.. y verla!!!!!
 
:'-(
 
6:22 PM
TOMA!
 
¡¡ PUTO AMO !!
 
destino += (wcslen(cadena1) );
 
:-D
 
le ponemos un separador cualquiera.. y listo...
sabemos como separar la cadena...
mira...
 
correcto :-)
 
6:23 PM
y no hay que ir y volver...
 
ERES EL REY :-O
 
wchar_t *destino = buff;
		*destino = 0;
		const wchar_t *cadena1 = L"1esta es una cadena1";
		const  wchar_t* cadena2 = L"2esta es una cadena2";
		const  wchar_t* cadena3 = L"3esta es una cadena3";
		const  wchar_t* cadena4 = L"4esta es una cadena4";
		const wchar_t* separador = L"&&";
		wcscpy(destino,cadena1);
		destino += (wcslen(cadena1) );
		//Agrego separador
		wcscpy(destino, separador);
		destino += (wcslen(separador));
		wcscpy(destino, cadena2);
	    destino += (wcslen(cadena2) );
		wcscpy(destino, separador);
 
¡¡ Si Señor !!
 
:)
vaya y actualice la respuesta :)
 
tendrá que esperar :-(
tengo cumpleaños del niño ... hay que empezar a vestirlo
 
6:27 PM
bueno.. pero no te tomes mucho tiempo
jajajajaja
que el niño se vista solo carajo
jajajajaja
@Phi ya esta.. lo resolvimos!
 
ojalá ...
:-(
¿ Borro la mia y publicas tú ?
Que te lo has ganado
:-)
 
@Trauma naaaaaaa tu eres el experto en c++.. yo solo copie y pegue...
 
huy lo que me ha dicho ... experto ...
xDD
ok. Pues muchas gracias @gbianchi :-)
Ahora cuando pueda actualizo
 
tengo esto:
// prevent double conversion
var attR = htmlAttributes as RouteValueDictionary;
if (attR != null)
{
attributes = (RouteValueDictionary)htmlAttributes;
}

var attD = htmlAttributes as IDictionary<string, object>;
else if (attD != null)
{
attributes = new RouteValueDictionary((IDictionary<string, object>)htmlAttributes);
}
me dice que me falta una llave en la linea: var attD = htmlAttributes as IDictionary<string, object>;
al final despues del ; pq puede ser ?
 
marcho ya :-(
 
6:30 PM
@Trauma vaya hombre.. yo te actualizo la respuesta y despues lo terminas de arreglar ;)
 
6:43 PM
listo @Trauma, Ahi agregue todo lo que hay que hacer.. obviamente sos libre de arreglar todo!
@byte96 hay alguna llave d emas en algun lado...
 
buen día hermanos
felicitaciones @Trauma y @gbianchi
esa pregunta de C++ y C# está demasiado épica
 
@fredyfx jajaja.. lindo trabajito nos llevo esto..
 
@gbianchi mis respetos
 
@gbianchi Gracias. Luego le echo un ojo ... no es que no me fie de tí ¿ eh ?
xDD
Marcho ... ¡ buen finde a todos !
 
@Trauma buen finde!
 
6:47 PM
cuídate bro @Trauma que la fuerza os acompañe
 
@fredyfx pero debugueando descubri el problema que tenia la libreria en c.. y de ahi, fue simple el problema...
ves.. debug!!! CHICOS DEBUGUEEN.. SIEMPRE!
 
Buen día @fredyfx
 
@gbianchi C? No era C++ ?
 
@fredyfx c++
 
@gbianchi qué esperas si los docentes rara vez le dedican tiempo a eso
@FranIslas buen día hermano :D
 
6:49 PM
bah.. igual el codio creo que es c.. no se si use algo de c++ aca
es trivial.. lo meti en un repo chapucero en mi git
jamas me hizo tan feliz solucionar algo que parecia tan basico
jajajaja
 
@ArtEze ¿Cual de los dos nombres es el más común que usan para nombrarte?
 
@Elenasys El segundo.
Solo en la escuela o las psiquiatras me llamaban Emiliano.
 
7:02 PM
@gbianchi épico. Material para otro webcast
 
@fredyfx totalmente...
 
@ArtEze aquí te llamamos @ArtEze con cariño :D
 
@fredyfx Gracias :)
 
de nada mi bro :D
somos una gran familia por estos lares de la red :D
diversos países, diversas culturas, todos compartiendo experiencias con el código y aventuras informáticas de detectives de bugs
 
 
1 hour later…
8:23 PM
@ArtEze Ok Ezequiel :-)
 
Phi
9:05 PM
@gbianchi mira nada más, qué belleza, qué golazo te acabas de aventar
@Trauma hombre de poca fe, después de esto @gbianchi me podrá decir que el cielo es color caca y le voy a creer :D
 
Phi
9:16 PM
@gbianchi igual y como nota adicional poner que es forzoso usar el StringBuilder ya que es mutable, y esto permite al código de C++ estar escribiendo en esas locaciones de memoria, si se llegara a poner como string, volvería a darnos el error del System.AccessViolationException
 
hasta el lunes
 
9:40 PM
Conocíais el concepto de monkey patching? Supongo que en javascript es bastante común
 
10:14 PM
@abulafia si pero por lo general no deberias usarlo
casi siempre hay alternativas
 
Ya lo sé, ya
no siempre las hay, de todas formas, y está bien conocer esa herramienta para cuando no te queda otro remedio
 
@abulafia mmmmm yo llevo muchos años y jamas la he necesitado.
 
Igual no llevas los suficientes :-)
Aparte, se usa bastante en testing, para implementar el mocking
al menos en el mundo python
 
@abulafia ya pero yo no me refiero al testing, estoy hablando de uso en las aplicaciones o frameworks
por ejemplo prototype lo hacia
no se si aun lo hace
 
No sé mucho de javascript, lo mío es Python. Entiendo que el monkey patching solo es posible en lenguajes interpretados y dinámicos, por eso mencioné js
 
10:24 PM
hacer monkey patching en un test no tiene consecuencias mayores, en tu codigo de produccion puede ser nefasto
 
y vale que en usos "normales" no lo necesites. Estamos de acuerdo que el monkey patching es algo bastante "anormal", casi como meterle mano a un exe y cambiar el código máquina...
pero insisto en que a veces no queda otra
no deja de ser un hack. Los hacks no deben usarse en producción, está claro
En python hay frameworks completos que dependen del monkey patching para funcionar
por ejemplo los que re-implementan toda la api de sockets para que sea asíncrona
y que te permiten que una aplicación síncrona y bloqueante, "mágicamente" pase a ser asíncrona sin más que importar un módulo al principio que parchea la bilbioteca estándar
 
No entiendo lo suficientemente bien el mecanismo de prototipos de JS como para comprender ese artículo que me enlazas, o su relación con lo que estábamos hablando
 
que la primera consecuencia de intentar parchear objetos nativos es el performance
y de ahi en adelante hay un monton mas
si por ejemplo quieres agregarle funcionalidad a una libreria tecnicamente no deberias hacer monkey patching ya que puedes crear un objeto nuevo con los mismos metodos que le hagan wrapper a la libreria que deseas
un ejemplo de esto es bluebird promisifyAll
 
Parece que todo eso es específico de JavaScript, en python no hay problemas de performance, salvo claro está que parchees una función que originalmente estaba implementada en C y la cambies por otra en python
Y cómo harías para, por ejemplo, sin tocar el código que instancia un montón de objetos de la clase Foo y que usan su método bar() cambiar su comportamiento?
 
10:37 PM
@abulafia lo entiendes mas facil cuando te das cuenta que las librerias en javascript son simples objetos
 
@devconcept Entiendo eso, pero en el fondo es equivalente al monkey patching, no?
 
@abulafia no, promisifyAll crea un objeto nuevo, monkey patching modifica el objeto en cuestion con el que trabajas
@abulafia Puedes hacer una clase nueva y sobreescribes el metodo. el hecho que estes intentando usar la clase original me dice que estas empleando una solución mas complicada de lo necesario.
te explico mejor
cuando haces import {Foo} from 'foo'; solo estas creando un identificador
puedes modificar ese identificador sin problemas usando import {Foo as Bar} from 'foo';
 
Ya, ya veo a dónde vas
 
creas tu clase que hereda de Foo extends Bar y luego la exportas nuevamente como Foo
 
y estoy de acuerdo en que esa es la forma de hacerlo sin necesidad de monkey patch
 
10:43 PM
exacto, no es facil darse cuenta pero el monkey patch es completamente innecesario
 
pero en el fondo eso yo lo consideraría también una forma de monkey patch. En el momento en que haces Foo = Bar
 
no para nada
 
estás "engañando" al código de usuario que instancia Foo sin saber que está instanciando Bar
quizás la técnica no sea monkey patch, pero el resultado sí
> A monkey patch is a way for a program to extend or modify supporting system software locally.
 
de nuevo no, cuando haces import {Foo as Bar} from 'foo' haces lo mismo que decir const Bar = require('foo').Foo
es una simple propiedad de un objeto
una vez que entiendes eso es mucho mas facil de visualizarlo en tu mente
 
que sí, que lo entiendo
quizás es que no me explico bien
que tienes razón desde un punto de vista técnico, pero que en el fondo, si debido a unas líneas de código que pongas al principio, alteras cómo funcionará todo el código que venga después, eso es mokey patch. No es sólo cambiar un método de una clase por otro. También es cambiar un identificador de una clase por otro
o hacer cualquier otra cosa que altere localmente el comportamiento
 
10:47 PM
@abulafia es que el consumidor de la libreria tambien puede importarlo como Baz y no usar Foo en lo absoluto y en tu codigo lo que tienes en teoria es una clase hija no la clase original modificada que es lo que significa hacer monkey patch
 
bueno, no discuto más. Si en el fondo te he entendido :-)
Y creo que tú a mi también
 
@abulafia :D jajajaja
monkey patch es cuando quiero coger un objeto nativo, eg: Array y ponerle un metodo para agregar soporte en un navegador determinado
el Array se escapa de tu control y por lo tanto debes usar monkey patch como unica via de exponer tu api o metodo
 
Bueno, quizás es que en el mundo python el monkey-patch es más frecuente, porque aparece más a menudo el caso en que no queda otro remedio
o porque simplemente no tiene efectos secundarios de performance
de hecho creo que el método envoltorio afectará más negativamente a la performance que el monkey patch
 
@abulafia exacto, es diferente al javascript
 

« first day (1197 days earlier)      last day (1912 days later) »