GOOGLE ADS

miércoles, 4 de mayo de 2022

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura.

{
"fullName": "FirstName LastName",
"listings": "5",
"items": [{
"type": "A",
"id": "xi0823109y",
"imgUrl": "imageurl.com/logo/png",
"addressListings": [{
"type": "residential",
"amount": "790909"
},
{
"type": "commerical",
"amount": "9808212"
}
]
}]
}

Puedo mostrar todos los datos en mi ListView, excepto en ciertas condiciones en las que addressListings puede tener 1 o 2 objetos, lo que significa que puede tener tanto Residencial como Comercial y solo quiero el valor por cantidad. Tengo problemas para poner una condición para verificar si alguno de los artículos está presente, siempre hay 1 artículo (residencial o comercial). Cuando trato de hacer una verificación nula, me da un error de rango.

Aquí está mi modelo

class CusomerDetails {
final String fullName;
final String listings;
final String type;
final String imgUrl;
final String id;
final String? amount;
CusomerDetails({
required this.fullName,
required this.listings,
required this.type,
required this.imgUrl,
required this.id,
this.amount,
});
}

Esta es la función en la que estoy tratando de obtener los datos y pasarlos al generador ListView

 Class GetCustomerData{
Future<List<CustomerDetails>> fetchData(queryStr) async {
try{
var response = await http.get(Uri,parse(apiurl+queryStr);
if(reponse.statusCode == 200){
return _parseResponse(response.body);
}else{
print('someError'}
}
on TimeoutException catch (_) {
print('Timeout Error');
}
throw {};
}
}

List<CustomerDetails> _parseResponse(String jsonObj){
final jsonMapObj = jsonDecode(jsonObj);
final list = (jsonMapObj['items'] as list);
var obj = list.map((map)=> CustomerDetails)(
id:map['id'],
fullname:map['fullName'],
type:map['type'],
imgUrl:map[imgUrl],
amount:map['addressListings']['0']?['amount']?? 'Not Available',
// amount1:map['addressListings']['1']?['amount']?? 'Not Available' // tried this way out but didn't work so commented for now.
)).toList()
return obj;
}
}

Por último, si la cantidad no está presente, estoy tratando de pasar "No disponible", sin embargo, todavía tengo que llegar a eso, debido al error de rango.


Solución del problema

Class GetCustomerData{
Future<List<CustomerDetails>> fetchData(queryStr) async {
try{
var response = await http.get(Uri,parse(apiurl+queryStr);
if(reponse.statusCode == 200){
return _parseResponse(response.body);
}else{
print('someError'}
}
on TimeoutException catch (_) {
print('Timeout Error');
}
throw {};
}
}
List<CustomerDetails> _parseResponse(String jsonObj){
final jsonMapObj = jsonDecode(jsonObj);
final list = (jsonMapObj['items'] as list);
var obj = list.map((map)=> CustomerDetails)(
id:map['id'],
fullname:map['fullName'],
type:map['type'],
imgUrl:map[imgUrl],
amount:map['addressListings'].length<1?'Not Available':map['addressListings']['0']['amount']?? 'Not Available',
amount1:map['addressListings'].length<2? 'Not Available':map['addressListings']['1']['amount']?? 'Not Available' // tried this way out but didn't work so commented for now.
)).toList()
return obj;
}
}

Eliminar archivos y carpetas dentro de la carpeta si está vacía (Java)

 String dirWay = "C:\\Project";
int daysBack = 7;
File directory = new File(dirWay);
if(directory.exists()){
File[] listFiles = directory.listFiles();
long purgeTime = System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
for(File listFile: listFiles) {
if(listFile.lastModified() < purgeTime) {
if(!listFile.delete()) {
System.err.println("Unable to delete file: " + listFile);

} else {
System.out.println(listFile);
}
}
}
}

Esto funciona solo para archivos de carpetas de proyectos. Pero tengo algunas carpetas y archivos en la carpeta Proyecto, y cada carpeta tiene algunas carpetas y archivos.

¿Cómo puedo verificar dentro de todas las carpetas y verificar la última fecha de modificación de los archivos y eliminarlos si tienen más de 7 días?

Por ejemplo, tengo el directorio: C:/Proyecto/JavaIdea/... Si los archivos en la carpeta JavaIdea tienen más de 7 días, necesito eliminar todos los archivos y la carpeta JavaIdea también.


Solución del problema

La forma más fácil es probablemente usar Files.walkFileTree. Files.walkte da un Stream<Path>, pero las carpetas van primero, no después. Por FileVisitorotro lado, usa dos eventos para carpetas: antes de visitar y después.

Algo que podría funcionar (no probado):

Deque<LongAdder> counts = new ArrayDeque<>(); // counting # of remaining files per level
Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) {
counts.push(new LongAdder());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(T dir, BasicFileAttributes attrs) throws IOException {
long remaining = counts.pop().sum();
if (remaining == 0) {
// the directory is empty now, delete it
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException {
if (is old enough to delete) {
// delete
} else {
counts.peek().increment();
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(T file, IOException exc) {
counts.peek().increment();
return FileVisitResult.CONTINUE;
}
});

JavaScript: AJAX espera el valor de retorno de PHP

Soy novato en AJAX. Mi objetivo es abrir en JavaScript un archivo php.


function checkCorrect(userEntry, solution) {
return fetch("checkSolution.php", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
},
body: `userEntry=${userEntry}&solution=${solution}`,
})

.then((response) => response.text())
.then((res) => (res))
.catch(err => console.log("checkCorrect: " + err));
}
function checkSolution() {
result = checkCorrect(userEntry, solution);
alert(result)
}

Solución del problema

De hecho, fetch es asíncrono. no lo sabía En mi caso, estoy buscando un método síncrono.

XMLHttpRequest es el enfoque correcto en mi caso.

Y aquí está la solución:


function checkCorrect(userEntry, solution) {
var ret_value = null;
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function() {
if (this.readyState==4 && this.status==200) {
ret_value = xmlhttp.responseText;
}
}

xmlhttp.open("POST","checkSolution.php",false);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send("userEntry="+userEntry+"&solution="+solution);
return ret_value;
}

reaccionar | ForwardedRef usando React.Component

Estoy creando un componente personalizado en React y necesito exportarlo usando forwardedRef. Pero cuando lo intento, aparece este error:

error

my code:

export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>{
ref?: React.RefObject<HTMLButtonElement>;
}
class Button extends React.Component<ButtonProps> {
render() {
const {
ref,
children,
...otherProps
} = this.props;
return (
<button
{...otherProps}
ref={ref}
>
{children}
</button>
)
}
}
const ButtonForwarded = React.forwardRef<ButtonProps>((props, ref) =>
<Button {...props} ref={ref} /> );
ButtonForwarded.displayName = 'Button';
export default ButtonForwarded;


Solución del problema

Cree el componente ButtonForwarded así:

const ButtonForwarded = React.forwardRef((props: ButtonProps, ref: LegacyRef<Button>) => <Button {...props} ref={ref} /> );

¿Cómo puedo estimar la compresibilidad de un archivo sin comprimirlo?

Estoy usando un servidor basado en bucle de eventos en python retorcido que almacena archivos, y me gustaría poder clasificar los archivos según su compresibilidad.

Si la probabilidad de que se beneficien de la compresión es alta, irán a un directorio con la compresión btrfs activada; de lo contrario, irán a otro lugar.

No necesito estar seguro: una precisión del 80% sería suficiente y ahorraría mucho espacio en disco. Pero dado que también existe el problema de rendimiento de la CPU y fs, no puedo simplemente guardar todo comprimido.

Los archivos están en los megabytes bajos. No puedo probarlos y comprimirlos sin usar una gran cantidad de CPU y retrasar indebidamente el ciclo de eventos o refactorizar un algoritmo de compresión para que encaje en el ciclo de eventos.

¿Hay alguna mejor práctica para dar una estimación rápida de la compresibilidad? Lo que se me ocurrió fue tomar una pequeña porción (unos pocos kB) de datos desde el principio del archivo, probarlo y comprimirlo (con un retraso presumiblemente tolerable) y basar mi decisión en eso.

¿Alguna sugerencia? ¿Sugerencias? ¿Defectos en mi razonamiento y/o problema?


Solución del problema

Solo 10K desde la mitad del archivo hará el truco. No desea el principio ni el final, ya que pueden contener información de encabezado o avance que no es representativa del resto del archivo. 10K es suficiente para obtener cierta cantidad de compresión con cualquier algoritmo típico. Eso predecirá una cantidad relativa de compresión para todo el archivo, en la medida en que ese medio 10K sea representativo. La proporción absoluta que obtenga no será la misma que para todo el archivo, pero la cantidad que difiere de la no compresión le permitirá establecer un umbral. Simplemente experimente con muchos archivos para ver dónde establecer el umbral.

Como se indicó, puede ahorrar tiempo al no hacer nada con los archivos que obviamente ya están comprimidos, por ejemplo,.png..jpg.,.mov,.pdf,.zip, etc.

Medir la entropía no es necesariamente un buen indicador, ya que solo proporciona una estimación de la compresibilidad de orden cero. Si la entropía indica que es lo suficientemente comprimible, entonces es correcto. Si la entropía indica que no es lo suficientemente comprimible, entonces puede ser correcta o no. Su compresor real es un estimador mucho mejor de la compresibilidad. Ejecutarlo en 10K no llevará mucho tiempo.

Creando una capa de máscara en p5js

Me gustaría dibujar un patrón, y luego solo mostrar ese patrón donde se superpone con una forma que especifique. Similar a cómo funciona una capa de máscara en Photoshop. ¿Alguien sabe cómo puedo abordar esto?


Solución del problema

Esto debería usar un proceso de 4 pasos:

  • cree su máscara con beginShape()/endShape y beginContour()/endContour() en el medio para que se muestre el área. Haces esto en un búfer.

    function setup() {
    createCanvas(400, 400);
    background(30)
    fill(200,50,60)
    msk = createGraphics(width,height)
    pattern = createGraphics(width,height)
    pixelDensity(1)
    msk.beginShape();
    // Exterior part of shape, clockwise winding
    msk.vertex(0, 0);
    msk.vertex(400, 0);
    msk.vertex(400, 400);
    msk.vertex(0, 400);
    // Interior part of shape, counter-clockwise winding
    msk.beginContour();
    msk.vertex(20, 20);
    msk.vertex(50, 220);
    msk.vertex(120, 380);
    msk.vertex(370, 320);
    msk.vertex(240, 160);
    msk.vertex(350, 40);
    msk.endContour();
    msk.endShape(CLOSE);
    mPixs = msk.loadPixels()
    }


  • Luego crea un búfer diferente para el patrón.

    for (let c=0; c<9; c++) {
    for (let r=0; r<9; r++) {
    pattern.circle(width/8*c,height/8*r,40)
    }
    }


  • Ahora cargue píxeles de la máscara y use el valor alfa de cada píxel en el nivel alfa de cada píxel correspondiente en el patrón.

    pattern.loadPixels()
    msk.loadPixels()
    for (let i=0; i < pattern.pixels.length; i+=4){
    pattern.pixels[i+3] = msk.pixels[i+3]
    }
    pattern.updatePixels()


  • Finalmente, simplemente agregue el búfer resultante a su lienzo principal conimage(pattern,0,0)


  • ¡Eche un vistazo a este ejemplo de trabajo cuidadosamente codificado solo para usted!:D


    let msk, pattern, mPixs
    function setup() {
    createCanvas(400, 400);
    background(30)
    fill(200,50,60)
    msk = createGraphics(width,height)
    pattern = createGraphics(width,height)
    pixelDensity(1)
    msk.beginShape();
    // Exterior part of shape, clockwise winding
    msk.vertex(0, 0);
    msk.vertex(400, 0);
    msk.vertex(400, 400);
    msk.vertex(0, 400);
    // Interior part of shape, counter-clockwise winding
    msk.beginContour();
    msk.vertex(20, 20);
    msk.vertex(50, 220);
    msk.vertex(120, 380);
    msk.vertex(370, 320);
    msk.vertex(240, 160);
    msk.vertex(350, 40);
    msk.endContour();
    msk.endShape(CLOSE);
    mPixs = msk.loadPixels()
    }
    function draw() {

    for (let c=0; c<9; c++) {
    for (let r=0; r<9; r++) {
    pattern.circle(width/8*c,height/8*r,40)
    }
    }
    for (let c=0; c<9; c++) {
    for (let r=0; r<9; r++) {
    let xo=random(-5,5), yo=random(-5,5)
    circle(width/8*c+xo,height/8*r+yo,50)
    }
    }
    pattern.loadPixels()
    msk.loadPixels()
    for (let i=0; i < pattern.pixels.length; i+=4){
    pattern.pixels[i+3] = msk.pixels[i+3]
    }
    pattern.updatePixels()
    image(pattern,0,0)
    }

    html, body {
    margin: 0;
    padding: 0;
    }
    canvas {
    display: block;
    }

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/addons/p5.sound.min.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
    <meta charset="utf-8" />
    </head>
    <body>
    <main>
    </main>
    <script src="sketch.js"></script>
    </body>
    </html>

    asp consumiendo un servicio web, ¿qué hacer con el objeto del conjunto de registros?

    Actualmente ejecuto una página web ASP clásica (antigua) con un objeto de conjunto de registros que se usa directamente en el viejo código Spagethi incorrecto.

    Estoy pensando en implementar una capa de datos en asp.net como servicio web para mejorar la capacidad de administración. Este es también un primer paso para actualizar el sitio web a asp.net. El sitio en sí sigue siendo ASP por el momento...

    ¿Alguien puede recomendar una buena manera de reemplazar el tipo de objeto del conjunto de registros con un tipo compatible con el servicio web (como una matriz o algo así)? ¿Con qué reemplazo a continuación?:

    set objRS = oConn.execute(SQL)
    while not objRS.eof
    ...
    name = Cstr(objRS(1))
    ...
    wend

    y también se pueden reemplazar varios conjuntos de registros? Yo estoy hablando:

     set objRS = objRs.nextRecordset 

    ¿Alguien pasó por esto y puede recomendar?

    @AdditionalInfo - lo pediste:-)

    Dejame empezar por el principio.
    La situación existente es: tengo un sitio web ASP antiguo con contenido jerárquico clásico (encabezado, sección, subsección, contenido) extraído de la base de datos a través de procedimientos almacenados y las páginas de contenido también están en la base de datos (un enlace a un archivo html).

    Ahora lo malo es que el código ASP en todas partes se distribuye en muchos archivos.asp, todos haciendo sus propias conexiones de base de datos, leyendo, escribiendo (tienes que registrarte para el contenido). Recientemente tuvimos problemas con los ataques de inyección SQL, así que me llamaron para solucionarlo.

    Podría cambiar todas las páginas.asp para evitar la inyección de sql, pero sería una locura. Así que pensé en crear una capa de datos: todas las páginas que usan esta capa para acceder a la base de datos. Una vez colocado para corregir y actualizar el código de acceso a la base de datos.

    Al tomar esa decisión, pensé que la actualización de asp.net no estaba muy lejos, ¿por qué no comenzar a usar asp.net para la capa de datos? De esta manera, se puede reutilizar al actualizar el sitio.

    ¡Eso me lleva a las preguntas anteriores!


    Solución del problema

    Primero, mi consejo favorito de esta semana: no trate su servicio web como si fuera un objeto local o pagará un precio de rendimiento muy alto. Esencialmente, no haga cosas como esta en su aplicación web:

    MyDataWebService ws = new MyDataWebService();
    foreach(DataItem item in myData)
    {
    ws.Insert(item);
    }

    Siempre debe preferir minimizar las llamadas a su servicio web (y SQL):

    MyDataWebService ws = new MyDataWebService();
    ws.Insert(myData); // Let the web service process the whole set at once.

    Ahora, en cuanto al tipo de datos a usar para las llamadas de su servicio web, básicamente tiene dos opciones:


    • conjunto de datos

    • Todo lo demás (matriz)


    La mayoría de las colecciones devueltas por un servicio web (como List<MyData>) en realidad se convierten en una matriz durante la invocación del servicio web. Recuerde que los servicios web no devuelven objetos (datos + comportamiento) sino solo estructuras de datos (o una secuencia de). Por lo tanto, hay poca distinción entre una Lista y una Matriz.

    Los conjuntos de datos son clases más complejas; usan su propio serializador personalizado y prácticamente se recrean por completo en la aplicación de llamada. Hay un costo en el rendimiento a pagar por el uso de conjuntos de datos como ese, por lo que generalmente no lo recomiendo para la mayoría de los escenarios. El uso de matrices para pasar datos de un lado a otro tiende a ser más eficiente y, francamente, es más fácil de hacer.

    Tu caso es un poco diferente; debido a que está convirtiendo un sitio existente que ya usa ADO, un DataSet de ADO.NET podría ser su mejor ruta de actualización. ADO.NET y ADO son lo suficientemente similares como para que una actualización directa sea más fácil de esa manera. Depende de cómo esté construido su sitio web.

    Para la última parte de su pregunta, DataSets admite múltiples conjuntos de registros similares al Recordset de ADO. Se llaman tablas de datos. Cada DataSet tiene al menos un DataTable y puede leerlos en cualquier orden.

    Buena suerte.

    Flutter: error de rango al acceder a la respuesta JSON

    Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...