GOOGLE ADS

sábado, 30 de abril de 2022

BottomSheetDialogFragment: cómo establecer la altura expandida (o el desplazamiento superior mínimo)

Creo un BottomSheetDialogFragmenty quiero ajustar su altura máxima expandida. ¿Cómo puedo hacer eso? Puedo recuperar el BottomSheetBehaviourpero todo lo que puedo encontrar es un setter para la altura de vista pero nada para la altura expandida.

public class DialogMediaDetails extends BottomSheetDialogFragment
{
@Override
public void setupDialog(Dialog dialog, int style)
{
super.setupDialog(dialog, style);
View view = View.inflate(getContext(), R.layout.dialog_media_details, null);
dialog.setContentView(view);
...
View bottomSheet = dialog.findViewById(R.id.design_bottom_sheet);
BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
behavior.setPeekHeight(...);
// how to set maximum expanded height???? Or a minimum top offset?
}
}

EDITAR

¿Por qué necesito eso? Porque muestro un BottomSheetDiálogo en una actividad de pantalla completa y se ve mal si BottomSheetdeja un espacio en la parte superior...


Solución del problema

Obtener referencia al comportamiento de la hoja,

private val behavior by lazy { (dialog as BottomSheetDialog).behavior }

apáguelo fitToContentsy configúrelo expandedOffseten los píxeles deseados.

behavior.isFitToContents = false
behavior.expandedOffset = 100

Crear listas con valores de comparaciones entre grupos almacenados dentro de una tabla en R

Tengo un marco de datos como;

Comparison Distance
A,B 2
A,C 30
A,D 32
A,E 34
B,C 31
B,D 40
B,E 5
C,E 2
C,D 6
D,E 7

y tengo dos listas como;

Group_1 <- c("A","B")
Group_2 <- c("C","D","E")

y me gustaría generar tres nuevas listas donde pongo todo lo que hay Comparisonentre el elemento en Group_1y Group_2en List1_G1vsG2, una List2_G1vsG1 con comparación dentro del elemento de Group_1y en List3_G2vsG2 para la comparación dentro de los elementos de Group_1.

Entonces debería obtener las siguientes listas:

Lista1_G1vsG2

c(30,32,34,31,40)

Lista2_G1vsG1

c(2)

Lista3_G2vsG2

c(5,2,6,7)

Aquí está el marco de datos en dput()formato si puede ayudar

structure(list(Comparison = c("A,B", "A,C", "A,D", "A,E", "B,C", 
"B,D", "B,E", "C,E", "C,D", "D,E"), Distance = c(2, 30, 32, 34,
31, 40, 5, 2, 6, 7)), class = "data.frame", row.names = c(NA,
-10L))


Solución del problema

Tal vez esto esté más allá del alcance de su solicitud. Puede personalizar una función de cálculo de matriz de distancia. De esta manera, puede determinar si la distancia entre A y B es igual o no a la de B y A.

f <- function(x, y, dist.df){
pair <- outer(x, y, paste, sep = ",")
dist <- dist.df[[2]][match(pair, dist.df[[1]])]
matrix(dist, length(x), dimnames = list(x, y))
}
f(Group_1, Group_2, df)
# C D E
# A 30 32 34
# B 31 40 5
f(Group_1, Group_1, df)
# A B
# A NA 2
# B NA NA
f(Group_2, Group_2, df)
# C D E
# C NA 6 2
# D NA NA 7
# E NA NA NA

¿Cómo se puede guardar un modelo de keras en formato de 64 bits?

¿Cómo se puede guardar un modelo de Keras en formato de 64 bits?
Esto es capaz de 'poner tensorflow' en 'modo' de 64 bits para el tiempo de ejecución actual. Pero descubrí que incluso simplemente guardar el modelo y volver a cargarlo es suficiente para truncar la precisión de 64 bits y cambiar las salidas del modelo.

En particular, me gustaría guardar el modelo de tal manera que se cargaría automáticamente en 'modo de 64 bits' y, obviamente, nunca perdería su precisión.


Solución del problema

"Token Z inesperado en JSON en la posición 0" al intentar publicar datos de formulario web en DynamoDB

Estoy creando una aplicación con un formulario web que cuando el usuario hace clic en "enviar", los datos se agregan a una tabla de DynamoDB.

El código HTML de mi formulario web incluye una API (creada con API Gateway) que activa una función Lambda que debe analizar los datos y colocarlos en DynamoDB. Sin embargo, recibo un Unexpected token Z in JSON at position 0error cuando envío el formulario web.

Aquí está mi código HTML:

<!DOCTYPE html>
<html lang="en-US">
<body>
<p>Sign-Up Form</p>
<form action="https://XXXXXXXXXX.execute-api.us-east-1.amazonaws.com/Prod/submit" method="post">
<ul>
<li>
<label for="first_name">First Name:</label>
<input type="text" id="first_name" name="first_name" required>
</li>
<li>
<label for="last_name">Last Name:</label>
<input type="text" id="last_name" name="last_name" required>
</li>
<li>
<label for="mail">E-mail:</label>
<input type="email" id="mail" name="user_email" required>
</li>
<li>
<label for="region">Which region are you based in?</label>
<select name="region" id="region" required>
<option value="">--Select--</option>
<option value="emea">EMEA</option>
<option value="amer">AMER</option>
<option value="apj">APJ</option>
</select>
</li>
<li class="button">
<button type="submit">Submit Sign-Up Form</button>
</li>
</ul>
</form>
</body>
</html>

Aquí está mi función Lambda:

const AWS = require("aws-sdk");
const dynamo = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event, context) => {
let body;
let statusCode = 200;
const headers = {
"Content-Type": "application/json"
};
try {
switch (event.routeKey) {
case "POST /items":
let requestJSON = JSON.parse(event.body);
await dynamo
.post({
TableName: "XXXXXX",
Item: {
first_name: requestJSON.first_name,
last_name: requestJSON.last_name,
user_email: requestJSON.user_email,
region: requestJSON.region
}
})
.promise();
body = `Put item ${requestJSON.user_email}`;
break;
default:
throw new Error(`Unsupported route: "${event.routeKey}"`);
}
} catch (err) {
statusCode = 400;
body = err.message;
} finally {
body = JSON.stringify(body);
}
return {
statusCode,
body,
headers
};
};

Cualquier ayuda para resolver este error sería muy apreciada.


Solución del problema

Los formularios no envían datos en formato JSON. Los formularios envían application/x-www-form-urlencodetipo de contenido. Puede usar el objeto URLSearchParams para trabajar con los datos del formulario.

Regex fallando en los parens derechos

Tengo esta expresión regular de.NET:

^(?<prefix>("[^"]*"))\s(?<attrgroup>(\([^\)]*\)))\s(?<suffix>("[^"]*"))$

Coincide correctamente con las siguientes cadenas:

"some prefix" ("attribute 1" "value 1") "some suffix"
"some prefix" ("attribute 1" "value 1" "attribute 2" "value 2") "some suffix"

Falla en...

"some prefix" ("attribute 1" "value (fail) 1") "some suffix"

...debido al paréntesis derecho después de "fail".

¿Cómo puedo modificar mi expresión regular para que el attrgroupgrupo de coincidencias termine conteniendo " ("attribute 1" "value (fail) 1")"? Lo he estado mirando durante demasiado tiempo y necesito algunos ojos nuevos. ¡Gracias!

Editar: attrgroup nunca contendrá nada más que pares de cadenas entre comillas dobles.


Solución del problema

mi suposición no probada:

^(?<prefix>("[^"]*"))\s(?<attrgroup>(\(("[^"]*")(\s("[^"]*")*)**\)))\s(?<suffix>("[^"]*"))$

por la presente he reemplazado

[^\)]*

con

("[^"]*")(\s("[^"]*")*)*

Asumí que todo lo que está entre paréntesis está entre comillas dobles o es un espacio en blanco.

Si quieres saber cómo se me ocurrió esto, lee Dominar las expresiones regulares.

PD. si estoy en lo correcto, esto también validará el grupo de atributos como pares de cadenas entrecomilladas.

necesita ayuda para cambiar el color en cv2, con la entrada del usuario en tinker

Tengo una lista de colores:

 red = (50, 50, 255)
blue = (255, 127, 0)
dark_blue = (127, 20, 0)
green = (127, 255, 0)

Inicialmente, configuré el color de salida:

 line_colour = red

esto funciona al dibujar una línea:

 cv2.line(img, (x3, y3), (x2, y2), line_colour, 5)

Expandí el programa para obtener la entrada de color del usuario, a través de Tinker:

 colour_list = ['red', 'blue', 'dark blue', 'green',
'light green', 'yellow', 'pink', 'black', 'white']

I am able to get the colour:

 line_clicked.get()

Necesita ayuda para cambiar cv2.line(......) para que el color de la línea se dibuje con la elección de color del usuario.


Solución del problema

Puede poner todos sus colores en un diccionario, con el nombre como clave y el RGB como valor.

Algo como:

color_dict = {'red': (50, 50, 255),
'blue': (255, 127, 0),
'dark blue': (127, 20, 0)} # etc...

Luego, si tiene un color seleccionado por el usuario:

selected_colour_name = line_clicked.get()

Puedes usar el diccionario para obtener el color RGB y dibujarlo:

line_colour = colour_dict[selected_colour_name]
cv2.line(img, (x3, y3), (x2, y2), line_colour, 5)

¿Cómo puedo crear un recibo de ventas de Oracle Apex SQL Workshop? Tengo que usar datos de SalesItem, Product y Transactions para hacer esto

Debo imprimir un "recibo" de una transacción de venta que ya ocurrió. Quiero el costo total en esa transacción usando declaraciones de selección múltiple.

SELECT TRANSACTIONDATE, PRODUCT.PRODUCTID, (UNITPRICE * QUANTITY) AS TOTAL
FROM SALESITEM, PRODUCT, TRANSACTIONS
WHERE PRODUCT.PRODUCTID = SALESITEM.PRODUCTID
AND TRANSACTIONS.TRANSACTIONID = SALESITEM.TRANSACTIONID
AND TRANSACTIONS.TRANSACTIONID = '106'
GROUP BY ROLLUP(TRANSACTIONDATE, PRODUCT.PRODUCTID)

¿Crees que una función de resumen funcionaría mejor? Mi objetivo es mostrar el costo total de esta transacción más el impuesto a las ventas.


Solución del problema

Podrías usar un CTE

WITH CTE AS (
SELECT TRANSACTIONDATE, PRODUCT.PRODUCTID, (UNITPRICE * QUANTITY) AS TOTAL
FROM SALESITEM, PRODUCT, TRANSACTIONS
WHERE PRODUCT.PRODUCTID = SALESITEM.PRODUCTID
AND TRANSACTIONS.TRANSACTIONID = SALESITEM.TRANSACTIONID
AND TRANSACTIONS.TRANSACTIONID = '106'
)
SELECT * FROM CTE
UNION ALL
SELECT null,null, SUM(TOTAL) * sales_tax_rate_as_decimal
UNION ALL
SELECT null,null, SUM(TOTAL) * ( 1 + sales_tax_rate_as_decimal);

Aplicación Unity: cómo comprobar el espacio disponible que queda en un dispositivo Android/IOS

Estoy desarrollando un juego (iOS/Android con Unity Game Engine) que requiere descargar recursos para almacenarlos localmente en el dispositivo. Deseo verificar el espacio libre en el dispositivo para enviar un mensaje de error antes de que comience la descarga en caso de que no sea suficiente.

¿Cómo puedo comprobarlo? No pude encontrar ningún procedimiento claro en mi investigación.


Solución del problema

Varía según la plataforma, por lo que no es una respuesta simple. El complemento gratuito de Unity Simple Disk Utils lo maneja por usted en Windows, Mac, Android e iOS y el código fuente completo está disponible en GitHub para que pueda ver por sí mismo cómo se logra en las diferentes plataformas.

Python: obtenga un valor de LISTA del campo en JSON

Tengo un archivo JSON que contiene tres campos: 2 son cadenas y el tercero es un campo que contiene una lista de valores.

{ "STREAM": "stream",
"BASIS_STREAM": "basis",
"PATHS": "[/opt/path1,/opt/path2]"
}

Ahora cargo ese JSON

with open('/pathToJsonFile.json', 'r') as f:
data = json.load(f)

Ahora quiero obtener esos valores.

stream=str(data["STREAM"])
basis=str(data["BASIS_STREAM"])
paths=data["BASE_PATHS"]

El tema es que pathstambién está amenazado como String, aunque tengo que usarlo como lista. Estoy convirtiendo con la strfunción de otros campos debido a Unicode. El código debe estar en python2. ¡Muchas gracias!


Solución del problema

Digamos que tiene un archivo llamado data.jsoncon los siguientes contenidos:

{
"STREAM": "stream",
"BASIS_STREAM": "basis",
"PATHS": "[/opt/path1,/opt/path2]"
}

Tal vez podrías usar después de llamar:str.splitjson.load

with open('data.json', 'r') as f:
data = json.load(f)
print 'data = %s' % data
stream = str(data['STREAM'])
basis = str(data['BASIS_STREAM'])
paths = [str(u_s) for u_s in data['PATHS'][1:-1].split(',')]
print 'stream = %s' % stream
print 'basis = %s' % basis
print 'paths = %s' % paths

Producción:

data = {u'PATHS': u'[/opt/path1,/opt/path2]', u'BASIS_STREAM': u'basis', u'STREAM': u'stream'}
stream = stream
basis = basis
paths = ['/opt/path1', '/opt/path2']

Quiero un soporte de expresiones regulares para caracteres que usan dirección IP con subred

Tengo una expresión regular ^[a-zA-Z0-9.*?]+$que admite direcciones IP, por ejemplo 31.202.216.280, ¿cómo puedo modificar la expresión regular dada de una manera en la que pueda admitir subredes con una dirección IP como esta?31.202.216.280/38


Solución del problema

Mire las expresiones regulares prefabricadas proporcionadas por estos módulos de Perl.

Regexp::Común::net

Regexp::Común::net::CIDR

Puede usarlos en la línea de comandos o desde un script de Perl. También puede simplemente copiar las expresiones regulares y usarlas en otro idioma.

¿Cómo sincronizo mi estado de búsqueda con Url y lo conecto al enrutador next.js?

Estoy siguiendo el ejemplo de búsqueda instantánea de reacción aquí: https://www.algolia.com/doc/guides/building-search-ui/going-further/routing-urls/react/

const createURL = state => `?${qs.stringify(state)}`;
const searchStateToUrl = searchState =>
searchState? createURL(searchState): '';
const urlToSearchState = ({ search }) => qs.parse(search.slice(1));

Y tengo dificultades para entender cómo funcionaría esto en el próximo js, ​​porque ¿cómo puedo conectar la searchStateToUrlfunción a mi próximo enrutador, ya que no acepto ningún accesorio en el próximo js?

export function App({ location, history }) {
const [searchState, setSearchState] = useState(urlToSearchState(location));
const debouncedSetStateRef = useRef(null);
function onSearchStateChange(updatedSearchState) {
clearTimeout(debouncedSetStateRef.current);
debouncedSetStateRef.current = setTimeout(() => {
history.push(searchStateToUrl(location, updatedSearchState));
}, DEBOUNCE_TIME);
setSearchState(updatedSearchState);
}
useEffect(() => {
setSearchState(urlToSearchState(location));
}, [location]);


Solución del problema

¿Viste este ejemplo de Vercel?

https://github.com/vercel/next.js/blob/canary/examples/with-algolia-react-instantsearch/pages/index.js

El proyecto no tiene un conjunto de codificación explícito

ingrese la descripción de la imagen aquí He estado usando vscode sin problemas, hasta hace poco. Ahora no aparecen errores, algunas variables nunca cambian de color. Y tengo un mensaje de error constante: "El proyecto... no tiene un conjunto de codificación explícito". No tengo idea de lo que tengo que hacer. ¡Toda ayuda es muy apreciada!


Solución del problema

Experimenté el mismo problema después de que la extensión Language Support for Java by Red Hat se actualizara a v1.5.0. No se informaron errores de código y solo se mostró el mensaje sobre la falta de codificación explícita en la pestaña Problemas.

Pude resolver el problema haciendo clic en "..." junto a "Proyectos Java" en la vista del Explorador y seleccionando "Limpiar espacio de trabajo", luego "Reiniciar y eliminar". Después de que la aplicación se volvió a cargar, el problema desapareció y el servidor de idiomas comenzó a funcionar como de costumbre.

Cómo asegurarse de que un objeto de superclase no sea nulo

Tengo dos clases, una es la subclase de otra. Quiero hacerlo para que la superclase pueda hacer sus métodos originales incluso si el objeto real es una instancia de la subclase.

El siguiente código imprime hola nulo y luego genera el error:Cannot invoke "A.doThis()" because "this.object" is null

public class A {
A object;
public void doSomething(){
System.out.println("hello " + object);
object.doThis();
}
public void doThis(){
System.out.println("Did this");
}
}

public class B extends A{
B object;
public static void main(String[] args){
B b = new B();
b.create();
}
public void create(){
object = new B();
object.doSomething();
}
}

Entiendo que en la Clase A, el objeto en realidad no se crea en ninguna parte, por lo que probablemente sea nulo. Me pregunto cómo puedo hacer para que no lo sea.


Solución del problema

If you want to reference an instance of the class within one of its methods, then use this.

Si desea asegurarse de que un método en una superclase mantenga su implementación original y nunca sea anulado por una subclase, entonces conviértalo en definitivo.

Si esto no es lo que quiere, entonces no creo que lo que está tratando de hacer sea realmente práctico.

public class A {
public final void doSomething(){
System.out.println("hello " + this);
this.doThis();
}
public final void doThis(){
System.out.println("Did this");
}
}
public class B extends A{
public static void main(String[] args){
B b = new B();
b.create();
}
public void create(){
this.doSomething();
}
}

Cuentas publicitarias no encontradas en v2/perfiles

Soy nuevo en la API de publicidad de Amazon. Tengo acceso a publicidad con mi KDP y mi cuenta de MBA en Amazon. También soy científico de datos, por lo que quiero analizar mis campañas más profundamente en R.

Entonces logré obtener mi accesst_token y refresh_token, pero cuando solicito 'https://advertising-api-eu.amazon.com/v2/profiles/' o 'https://advertising-api.amazon.com/v2/ perfiles/' solo puedo ver mis perfiles de KDP y dos perfiles publicitarios desconocidos de Alemania (todos con 'tipo de cuenta = proveedor').

Pero no puedo ver mis cuentas publicitarias de MBA de Alemania, Francia, España, Italia, Reino Unido o EE. UU. con sus campañas. ¿Estoy haciendo algo mal o me perdí algo en la configuración?

El ámbito es "publicidad::campaña_gestión.

Estoy agradecido por cualquier ayuda, la documentación oficial no ayuda mucho.


Solución del problema

Creo que se trata de un error existente en la API de publicidad. Es posible que deba crear un ticket de soporte en JIRA para que se resuelva.

Obtener una excepción "Error al iniciar el servicio jboss.module.service" para portlets de primavera

Gracias por tu tiempo

la versión que estamos usando liferay 6 - jboss 7 y aquí está la excepción de error que se obtiene al intentar evitar la carpeta lib que consiste en spring jars dentro de cada portlet war spring mvc3. Debido a que se agregó el mismo conjunto de archivos jar de dependencia de primavera a todos los portlets y se implementó todo el tiempo, en realidad aumenta la carga. Para deshacerse de esto, creó una carpeta dentro de los módulos [la estructura es así jboss/modules/com/spring/main/--jar files--] y agregó todas las bibliotecas comunes.

este es el modulo.xml

<module xmlns="urn:jboss:module:1.0" name="com.spring">
<resources>
<resource-root path="org.springframework.aop-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.asm-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.aspects-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.beans-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.context-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.context.support-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.core-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.expression-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.instrument-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.instrument.tomcat-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.jdbc-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.jms-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.orm-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.oxm-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.test-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.transaction-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.web-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.web.portlet-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.web.servlet-3.1.1.RELEASE.jar"/>
<resource-root path="org.springframework.web.struts-3.1.1.RELEASE.jar"/>
<resource-root path="standard.jar"/>
<resource-root path="util-java.jar"/>
<resource-root path="util-taglib.jar"/>
<resource-root path="util-bridges.jar"/>
<resource-root path="commons-logging.jar"/>
<resource-root path="ext-oneprm-liferay-portal-ext-util-bridges.jar"/>
<resource-root path="ext-oneprm-liferay-portal-ext-util-java.jar"/>
<resource-root path="ext-oneprm-liferay-portal-ext-util-taglib.jar"/>
</resources>
</module>

y jboss-deployement-structure.xml dentro del portlet

<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<dependencies>
<module name="com.liferay.portal"></module>
<module name="org.jboss.modules"></module>
</dependencies>
</deployment>
</jboss-deployment-structure>

Este es el error que estamos recibiendo ahora... ¿todavía me falta algo para mencionar dentro del portlet? alguien me puede ayudar por favor... gracias de antemano!!

20:38:41,812 INFO [org.jboss.as.server.controller] (DeploymentScanner-threads - 1) Deployment of "sample-spring-template-portlet.war" was rolled back with failure message {"Failed services" => {"jboss.module.service.\"deployment.sample-spring-template-portlet.war\".main" => "org.jboss.msc.service.StartException in service jboss.module.service.\"deployment.sample-spring-template-portlet.war\".main: Failed to load module: deployment.sample-spring-template-portlet.war:main"}}
20:38:42,140 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) Stopped deployment sample-spring-template-portlet.war in 323ms
20:38:42,140 ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Failed services" => {"jboss.module.service.\"deployment.sample-spring-template-portlet.war\".main" => "org.jboss.msc.service.StartException in service jboss.module.service.\"deployment.sample-spring-template-portlet.war\".main: Failed to load module: deployment.sample-spring-template-portlet.war:main"}}}}
20:51:35,192 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) 20:51:35,192 INFO [AutoDeployDir:167] Processing sample-spring-template-portlet-6.1.0.1.war
20:51:35,192 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) 20:51:35,192 INFO [PortletAutoDeployListener:71] Copying portlets for C:\apps\Liferay\JBOSS\Liferay-6.1.0\deploy\sample-spring-template-portlet-6.1.0.1.war
20:51:35,567 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) Expanding: C:\apps\Liferay\JBOSS\Liferay-6.1.0\deploy\sample-spring-template-portlet-6.1.0.1.war into C:\DOCUME~1\SESA23~1\LOCALS~1\Temp\20120507205135567
20:51:36,302 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) Copying 1 file to C:\DOCUME~1\SESA23~1\LOCALS~1\Temp\20120507205135567\WEB-INF
20:51:36,958 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) Copying 1 file to C:\DOCUME~1\SESA23~1\LOCALS~1\Temp\20120507205135567\WEB-INF\classes
20:51:36,958 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) Copying 1 file to C:\DOCUME~1\SESA23~1\LOCALS~1\Temp\20120507205135567\WEB-INF\classes
20:51:37,552 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) Copying 1 file to C:\DOCUME~1\SESA23~1\LOCALS~1\Temp\20120507205135567\WEB-INF\jsp
20:51:38,223 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) Copying 16 files to C:\apps\Liferay\JBOSS\Liferay-6.1.0\jboss-7.0.2\standalone\deployments\sample-spring-template-portlet.war
20:51:38,411 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) Copying 1 file to C:\apps\Liferay\JBOSS\Liferay-6.1.0\jboss-7.0.2\standalone\deployments\sample-spring-template-portlet.war
20:51:38,427 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) Deleting directory C:\DOCUME~1\SESA23~1\LOCALS~1\Temp\20120507205135567
20:51:38,489 INFO [stdout] (com.liferay.portal.kernel.deploy.auto.AutoDeployScanner) 20:51:38,489 INFO [PortletAutoDeployListener:81] Portlets for C:\apps\Liferay\JBOSS\Liferay-6.1.0\deploy\sample-spring-template-portlet-6.1.0.1.war copied successfully. Deployment will start in a few seconds.
20:51:38,630 INFO [org.jboss.as.server.deployment] (MSC service thread 1-3) Starting deployment of "sample-spring-template-portlet.war"
20:51:39,192 INFO [org.jboss.as.jpa] (MSC service thread 1-3) added javax.persistence.api dependency to sample-spring-template-portlet.war
20:51:39,677 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.deployment.unit."sample-spring-template-portlet.war".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.unit."sample-spring-template-portlet.war".INSTALL: Failed to process phase INSTALL of deployment "sample-spring-template-portlet.war"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:121)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [:1.7.0_03]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [:1.7.0_03]
at java.lang.Thread.run(Thread.java:722) [:1.7.0_03]
Caused by: java.lang.RuntimeException: Failed to load class org.springframework.web.servlet.ViewRendererServlet
at org.jboss.as.ee.component.deployers.EEClassConfigurationProcessor$1.compute(EEClassConfigurationProcessor.java:141)
at org.jboss.as.ee.component.deployers.EEClassConfigurationProcessor$1.compute(EEClassConfigurationProcessor.java:122)
at org.jboss.as.ee.component.LazyValue.get(LazyValue.java:40)
at org.jboss.as.ee.component.EEApplicationDescription.getClassConfiguration(EEApplicationDescription.java:183)
at org.jboss.as.ee.component.ComponentDescription.createConfiguration(ComponentDescription.java:153)
at org.jboss.as.ee.component.deployers.EEModuleConfigurationProcessor.deploy(EEModuleConfigurationProcessor.java:70)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:115)
... 5 more
Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.ViewRendererServlet from [Module "deployment.sample-spring-template-portlet.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:361)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:333)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:310)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:103)
at java.lang.Class.forName0(Native Method) [:1.7.0_03]
at java.lang.Class.forName(Class.java:264) [:1.7.0_03]
at org.jboss.as.ee.component.deployers.EEClassConfigurationProcessor$1.compute(EEClassConfigurationProcessor.java:139)
... 11 more
20:51:39,958 INFO [org.jboss.as.server.controller] (DeploymentScanner-threads - 1) Deployment of "sample-spring-template-portlet.war" was rolled back with failure message {"Failed services" => {"jboss.deployment.unit.\"sample-spring-template-portlet.war\".INSTALL" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"sample-spring-template-portlet.war\".INSTALL: Failed to process phase INSTALL of deployment \"sample-spring-template-portlet.war\""},"Services with missing/unavailable dependencies" => ["jboss.naming.context.java.module.sample-spring-template-portlet.sample-spring-template-portlet.ValidatorFactory missing [ jboss.naming.context.java.module.sample-spring-template-portlet.sample-spring-template-portlet ]","jboss.naming.context.java.module.sample-spring-template-portlet.sample-spring-template-portlet.Validator missing [ jboss.naming.context.java.module.sample-spring-template-portlet.sample-spring-template-portlet ]"]}
20:51:40,349 INFO [org.jboss.as.server.deployment] (MSC service thread 1-3) Stopped deployment sample-spring-template-portlet.war in 398ms
20:51:40,364 ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Failed services" => {"jboss.deployment.unit.\"sample-spring-template-portlet.war\".INSTALL" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"sample-spring-template-portlet.war\".INSTALL: Failed to process phase INSTALL of deployment \"sample-spring-template-portlet.war\""},"Services with missing/unavailable dependencies" => ["jboss.naming.context.java.module.sample-spring-template-portlet.sample-spring-template-portlet.ValidatorFactory missing [ jboss.naming.context.java.module.sample-spring-template-portlet.sample-spring-template-portlet ]","jboss.naming.context.java.module.sample-spring-template-portlet.sample-spring-template-portlet.Validator missing [ jboss.naming.context.java.module.sample-spring-template-portlet.sample-spring-template-portlet ]"]}}}


Solución del problema

Tu jboss-deployment-structure.xmlno creo que sea correcto. Intente eliminar los dos módulos que tiene y agregue uno para com.spring.

<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<deployment>
<dependencies>
<module name="com.spring"/>
</dependencies>
</deployment>
</jboss-deployment-structure>

¿Cómo agrego un enlace para continuar leyendo después de una cantidad limitada de texto?

Quiero agregar múltiples enlaces para leer más para continuar leyendo después de una cantidad limitada de texto como 1000 palabras o 2 párrafos


<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
$(document).ready(function(){
var maxLength = 300;
$(".show-read-more").each(function(){
var myStr = $(this).text();
if($.trim(myStr).length > maxLength){
var newStr = myStr.substring(0, maxLength);
var removedStr = myStr.substring(maxLength, $.trim(myStr).length);
$(this).empty().html(newStr);
$(this).append(' <a href="javascript:void(0);" class="read-more">read more...</a>');
$(this).append('<span class="more-text">' + removedStr + '</span>');
}
});
$(".read-more").click(function(){
$(this).siblings(".more-text").contents().unwrap();
$(this).remove();
});
});
</script>
<style>
.show-read-more.more-text{
display: none;
}
</style>
</head>
<body>
<p class="show-read-more">Ut auctor velit sed consectetur rhoncus. Nunc dictum facilisis felis nec facilisis. Integer nec justo vitae orci cursus fermentum. Fusce semper, mi non tempus congue, velit leo efficitur quam, laoreet venenatis libero felis et lacus. Pellentesque mattis hendrerit nisi gravida hendrerit. Mauris sagittis tincidunt scelerisque. Vivamus lectus erat, dictum et magna quis, iaculis finibus nisl. Aliquam quis ante odio. Etiam tincidunt tellus tristique turpis tincidunt, eget condimentum urna rutrum. Donec maximus consequat dolor, sit amet condimentum ipsum gravida ac. Etiam posuere tellus mauris, et dignissim nisl rutrum quis. Mauris tincidunt ante sed velit maximus, vel tincidunt leo imperdiet. Morbi nec lacus et metus semper porttitor. Sed pellentesque ex at pellentesque scelerisque. Aliquam placerat gravida tortor, in fermentum ante commodo quis. Etiam vehicula elementum quam. Aliquam eu augue eu lacus dignissim efficitur. Proin ex metus, ornare placerat nisi at, porta lobortis turpis. Praesent euismod nec nulla ultrices maximus. Vivamus imperdiet quam ac lobortis cursus. Nam dapibus ullamcorper magna vehicula aliquam. Vivamus hendrerit molestie neque. Ut interdum diam a purus ultrices facilisis. Suspendisse molestie tempor dolor, sed tristique enim sagittis vitae. Integer eu dignissim lectus, commodo efficitur metus. Morbi quis justo finibus, interdum sem quis, imperdiet tellus. Curabitur blandit vel magna nec elementum. Vivamus tempor, urna pharetra euismod euismod, elit elit tincidunt sem, ut consectetur arcu massa non diam. Etiam scelerisque nisi magna. Nulla facilisi. Sed pharetra nunc lectus, in maximus dolor ornare sit amet.</p>
<p>Etiam posuere tellus mauris, et dignissim nisl rutrum quis. Mauris tincidunt ante sed velit maximus, vel tincidunt leo imperdiet. Morbi nec lacus et metus semper porttitor. Sed pellentesque ex at pellentesque scelerisque. Aliquam placerat gravida tortor, in fermentum ante commodo quis. Etiam vehicula elementum quam. Aliquam eu augue eu lacus dignissim efficitur. Proin ex metus, ornare placerat nisi at, porta lobortis turpis.</p>
<p>Praesent euismod nec nulla ultrices maximus. Vivamus imperdiet quam ac lobortis cursus. Nam dapibus ullamcorper magna vehicula aliquam. Vivamus hendrerit molestie neque. Ut interdum diam a purus ultrices facilisis. Suspendisse molestie tempor dolor, sed tristique enim sagittis vitae. Integer eu dignissim lectus, commodo efficitur metus. Morbi quis justo finibus, interdum sem quis, imperdiet tellus. Curabitur blandit vel magna nec elementum. Vivamus tempor, urna pharetra euismod euismod, elit elit tincidunt sem, ut consectetur arcu massa non diam. Etiam scelerisque nisi magna. Nulla facilisi. Sed pharetra nunc lectus, in maximus dolor ornare sit amet.</p>

Solución del problema

Aquí hay una versión de trabajo


$(function() {
$(".show-read-more").each(function() {
const text = this.textContent;
const newHtml = text.match(/.{1,300}/g).map((str, i) => `<span class="more-text" hidden>${str} <a href="#" class="read-more">read more...</a></span>`);
$(this).html(newHtml);
$(this).find("span").eq(0).show(); // show the first
$(this).find("span a").last().remove(); // delete the last link
});
$(".show-read-more").on("click", ".read-more", function(e) {
e.preventDefault();
let $span = $(this).next(".more-text"); // span or next span
$span = $span.length>0? $span: $(this).parent().next(".more-text");
$span.contents().unwrap();
$(this).remove();
});
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<p class="show-read-more">Ut auctor velit sed consectetur rhoncus. Nunc dictum facilisis felis nec facilisis. Integer nec justo vitae orci cursus fermentum. Fusce semper, mi non tempus congue, velit leo efficitur quam, laoreet venenatis libero felis et lacus. Pellentesque mattis
hendrerit nisi gravida hendrerit. Mauris sagittis tincidunt scelerisque. Vivamus lectus erat, dictum et magna quis, iaculis finibus nisl. Aliquam quis ante odio. Etiam tincidunt tellus tristique turpis tincidunt, eget condimentum urna rutrum. Donec
maximus consequat dolor, sit amet condimentum ipsum gravida ac. Etiam posuere tellus mauris, et dignissim nisl rutrum quis. Mauris tincidunt ante sed velit maximus, vel tincidunt leo imperdiet. Morbi nec lacus et metus semper porttitor. Sed pellentesque
ex at pellentesque scelerisque. Aliquam placerat gravida tortor, in fermentum ante commodo quis. Etiam vehicula elementum quam. Aliquam eu augue eu lacus dignissim efficitur. Proin ex metus, ornare placerat nisi at, porta lobortis turpis. Praesent euismod
nec nulla ultrices maximus. Vivamus imperdiet quam ac lobortis cursus. Nam dapibus ullamcorper magna vehicula aliquam. Vivamus hendrerit molestie neque. Ut interdum diam a purus ultrices facilisis. Suspendisse molestie tempor dolor, sed tristique enim
sagittis vitae. Integer eu dignissim lectus, commodo efficitur metus. Morbi quis justo finibus, interdum sem quis, imperdiet tellus. Curabitur blandit vel magna nec elementum. Vivamus tempor, urna pharetra euismod euismod, elit elit tincidunt sem, ut
consectetur arcu massa non diam. Etiam scelerisque nisi magna. Nulla facilisi. Sed pharetra nunc lectus, in maximus dolor ornare sit amet.</p>
<p>Etiam posuere tellus mauris, et dignissim nisl rutrum quis. Mauris tincidunt ante sed velit maximus, vel tincidunt leo imperdiet. Morbi nec lacus et metus semper porttitor. Sed pellentesque ex at pellentesque scelerisque. Aliquam placerat gravida tortor,
in fermentum ante commodo quis. Etiam vehicula elementum quam. Aliquam eu augue eu lacus dignissim efficitur. Proin ex metus, ornare placerat nisi at, porta lobortis turpis.</p>
<p>Praesent euismod nec nulla ultrices maximus. Vivamus imperdiet quam ac lobortis cursus. Nam dapibus ullamcorper magna vehicula aliquam. Vivamus hendrerit molestie neque. Ut interdum diam a purus ultrices facilisis. Suspendisse molestie tempor dolor, sed
tristique enim sagittis vitae. Integer eu dignissim lectus, commodo efficitur metus. Morbi quis justo finibus, interdum sem quis, imperdiet tellus. Curabitur blandit vel magna nec elementum. Vivamus tempor, urna pharetra euismod euismod, elit elit tincidunt
sem, ut consectetur arcu massa non diam. Etiam scelerisque nisi magna. Nulla facilisi. Sed pharetra nunc lectus, in maximus dolor ornare sit amet.</p>

Creación dinámica de filas en la hoja de Excel con Apache POI

Estoy escribiendo un programa para leer un archivo xml grande y crear un archivo de Excel a partir de él. Los atributos de cada nodo serán los encabezados de columna en el archivo de Excel. Creé un objeto Dom y obtuve la lista de nodos. Necesito iterar a través de él y para cada nodo, necesito agregar una fila en la hoja de Excel con los valores de los atributos del nodo como valores de columna. Entonces, al iterar, necesito crear filas dinámicamente. ¿Cómo puedo hacerlo? No veo una funcionalidad para agregar filas creadas en Apache POI, hasta ahora lo que he visto es definir nuevas filas cada vez. No puedo hacerlo ya que tiene más de 5000 entradas. Básicamente lo que quiero hacer es:

 Node node = null;
HSSFRow datarow = null;
for (int i = 0; i < nodeList.getLength(); i++) {
node = nodeList.item(i);
datarow = spreadSheet.createRow(i);
//set values for data row here, and add it.
//so in the loop, next time the same variable will be assigned to spreadSheet.createRow(1) etc.
}

Entiendo que createRow se invoca desde spreadSheet, que le agregará la fila. Pero en el bucle, la misma variable también se asignará a otras filas, así que creo que finalmente solo obtendré 1 fila. Por favor, aconséjeme sobre esto.


Solución del problema

Prueba lo siguiente

 Node node = null;
HSSFRow datarow = null;
for (int i = 0; i < nodeList.getLength(); i++) {
// On each loop you get the value of node item
node = nodeList.item(i);
//For every new node list you will create a row
datarow = spreadSheet.createRow(i);
//Finally set the node value to the columns of the newly created Row
}

Espero que esto ayude!!

¿Cómo replicar el gráfico de correlación con coeficientes de escala de grises en la mitad inferior y círculos en la mitad superior?

Estoy buscando replicar este gráfico de correlación, o al menos acercarme lo más posible a él.

Específicamente, quiero:


  • los valores de correlación en la mitad inferior, con valores que varían en una escala de grises basada en el valor absoluto

  • los círculos en la mitad superior, con diámetro variable y en la escala de colores.

  • Quiero poder editar las etiquetas de escala del eje para que las descripciones completas estén en el eje y y las referencias numéricas en el eje x.


Me he acercado relativamente, pero no he logrado una replicación lo suficientemente precisa. Describo mis intentos más cercanos a continuación con código reproducible. El corrplotpaquete me ha acercado más.

 # general preparation
library(car)
correlations = cor(mtcars)

  • paquete corrupto

  •  library(corrplot)

    corrplot.mixed(correlations,
    upper = "number", #upper.col =???
    lower = "circle", #lower.col =???
    tl.pos = "lt", tl.col = "black", tl.cex = 0.5)

    Notas:


    • hay una forma de hacer los coeficientes en escala de grises, pero no la entiendo: https://rdrr.io/cran/corrplot/man/COL1.html

    • Por alguna extraña razón, cuando uso mis propios datos (a diferencia de mtcar), los colores de los coeficientes no coinciden con los valores de correlación reales. No puedo dar un ejemplo de código reproducible aquí, porque funciona bien con los mtcardatos.


  • paquete cormat

  •  source("http://www.sthda.com/upload/rquery_cormat.r")
    rquery.cormat(mtcar)

  • ggcorrplot

  •  library("ggcorrplot")

    # circles separate
    ggcorrplot(correlations, # correlation matrix
    method = "circle", # circles instead of squares
    type = "upper", # show only upped triangle
    show.diag = F, # don't show diagonal values (1)
    lab = F, # don't show cor coeffs
    outline.col = "white", # no outline of circles
    ggtheme = theme_bw, # theme
    colors = c("#440154FF","#238A8DFF","#FDE725FF"))

    # coefs separate
    ggcorrplot(correlations, # correlation matrix
    method = "circle", # circles instead of squares
    type = "upper", # show only upped triangle
    show.diag = F, # don't show diagonal values (1)
    lab = T, # don't show cor coeffs
    outline.col = NA, # don't show circles
    ggtheme = theme_bw, # theme
    colors = c("#440154FF","#238A8DFF","#FDE725FF"))

    # can't combine both plots?

  • paquete de corrección

  •  library(corrgram)

    corrgram(correlations,
    labels = indices_all,
    lower.panel = "panel.fill",
    upper.panel = "panel.cor")

    Algunas otras notas:


    • Parece que las mitades de las gráficas tienden a correr a través de la diagonal opuesta que en la gráfica de ejemplo, pero supongo que eso no es una gran preocupación.



    Solución del problema

    Las opciones listas para usar son rápidas y agradables. Sin embargo, cuando se trata de personalizar, en mi humilde opinión, puede valer la pena construir la trama desde cero usando ggplot2. Como primer paso, esto implica algunas disputas de datos para que su matriz de correlación tenga la forma correcta. También en este paso convierto las categorías a factors y una identificación numérica. Según los identificadores, dividí los datos en los valores diagonales superior e inferior que luego podrían trazarse por separado usando a geom_pointy a geom_text. Además de eso, es importante agregar drop=FALSEa la escala x e y para mantener todos los niveles de los factores y el orden correcto. También uso algunas funciones para obtener las etiquetas de eje deseadas:

    EDITAR: siguiendo la sugerencia de @AllanCameron, agregué un coord_equaltoque "final" para obtener una apariencia agradable de matriz cuadrada. Y gracias a @RichtieSacramento, el código ahora asigna el valor absoluto en el sizeaes.

    library(dplyr)
    library(tidyr)
    library(ggplot2)
    correlations = cor(mtcars)
    levels <- colnames(mtcars)
    corr_long <- correlations %>%
    data.frame() %>%
    mutate(row = factor(rownames(.), levels = levels),
    rowid = as.numeric(row)) %>%
    pivot_longer(-c(row, rowid), names_to = "col") %>%
    mutate(col = factor(col, levels = levels),
    colid = as.numeric(col))
    ggplot(corr_long, aes(col, row)) +
    geom_point(aes(size = abs(value), fill = value),
    data = ~filter(.x, rowid > colid), shape = 21) +
    geom_text(aes(label = scales::number(value, accuracy =.01), color = abs(value)),
    data = ~filter(.x, rowid < colid), size = 8 /.pt) +
    scale_x_discrete(labels = ~ attr(.x, "pos"), drop = FALSE) +
    scale_y_discrete(labels = ~ paste0(.x, " (", attr(.x, "pos"), ")"), drop = FALSE) +
    scale_fill_viridis_c(limits = c(-1, 1)) +
    scale_color_gradient(low = grey(.8), high = grey(.2)) +
    coord_equal() +
    guides(size = "none", color = "none") +
    theme(legend.position = "bottom",
    panel.grid = element_blank(),
    axis.ticks = element_blank()) +
    labs(x = NULL, y = NULL, fill = NULL)

    ingrese la descripción de la imagen aquí

    ¿Cómo convertir mongodb ISODate a cadena en mongoDB?

    Tengo mi ISODate en mongo como ISODate y solo quiero eso en formato de cadena con un formato de fecha y hora específico.

    Aquí está la fecha ISO:

    ISODate("2020-04-24T11:41:47.280Z")

    Resultado Esperado:

    "2020-04-24T11:41:47.280Z"

    Quiero que esto suceda en mongodb solo porque muchos de mis servicios esperan en este formato, y no quiero hacer cambios en todos los servicios ya que es un trabajo tedioso.


    Solución del problema

    Obtuve el resultado esperado mientras intentaba lo siguiente.

    ISODate("2020-04-24T11:41:47.280Z").toJSON()

    Esto me devolverá la cuerda.

    "2020-04-24T11:41:47.280Z"

    ¿Hice un comando a través de un diálogo en mirc?

    Creé un cuadro de diálogo que permite expulsar a un usuario. este cuadro de diálogo tiene un cuadro de texto donde el usuario debe escribir el nombre del pateado y luego presionar el botón OK para patear. Creé todo el cuadro de diálogo pero no entiendo cómo dar el comando en ok. ¿Alguien puede ayudarme?


    Solución del problema

    Deberá crear un sclickevento para ese diálogo:

    on *:dialog:DIALOG_NAME:sclick:BUTTON_ID:{
    ; PSEUDO: get contents of textbox
    ; PSEUDO: kick user
    }

    Firme un mensaje con el algoritmo EdDSA en Javascript para obtener JWT

    Necesito obtener JWT con el algoritmo EdDSA para poder usar una API. Tengo la clave privada para firmar el mensaje y podría hacerlo con PHP con la siguiente biblioteca: https://github.com/firebase/php-jwt (puede ver el ejemplo con EdDSA en README). Ahora necesito hacer lo mismo en JS pero no encontré la manera de obtener JWT con una clave secreta dada (base codificada 64) así (solo un ejemplo no es la clave secreta real):

    const secretKey = Dm2xriMD6riJagld4WCA6zWqtuWh40UzT/ZKO0pZgtHATOt0pGw90jG8BQHCE3EOjiCkFR2/gaW6JWi+3nZp8A==

    Probé muchas bibliotecas como jose, js-nacl, crypto, libsodium, etc. Y estoy muy cerca de obtener el JWT con la biblioteca libsodium, ahora adjunto el código:

    const base64url = require("base64url");
    const _sodium = require("libsodium-wrappers");
    const moment = require("moment");
    const getJWT = async () => {
    await _sodium.ready;
    const sodium = _sodium;
    const privateKey =
    "Dm2xriMD6riJagld4WCA6zWqtuWh40UzT/ZKO0pZgtHATOt0pGw90jG8BQHCE3EOjiCkFR2/gaW6JWi+3nZp8A==";
    const payload = {
    iss: "test",
    aud: "test.com",
    iat: 1650101178,
    exp: 1650101278,
    sub: "12345678-1234-1234-1234-123456789123"
    };
    const { msg, keyAscii} = encode(payload, privateKey, "EdDSA");
    const signature = sodium.crypto_sign_detached(msg, keyDecoded); //returns Uint8Array(64)
    //Here is the problem.
    };

    const encode = (payload, key, alg) => {
    const header = {
    typ: "JWT",
    alg //'EdDSA'
    };
    const headerBase64URL = base64url(JSON.stringify(header));
    const payloadBase64URL = base64url(JSON.stringify(payload));
    const headerAndPayloadBase64URL = `${headerBase64URL}.${payloadBase64URL}`;
    const keyAscii= Buffer.from(key, "base64").toString("ascii");
    return {headerAndPayloadBase64URL, keyAscii}
    };

    El problema está en la función de sodio.crypto_sign_tached porque devuelve una firma Uint8Array(64) y necesito el JWT así:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSJ9.eyJpc3MiOiJ0ZXN0IiwiYXVkIjoidGVzdC5jb20iLCJpYXQiOjE2NTAxMDExNzgsImV4cCI6MTY1MDEwMTI3OCwic3ViIjoiMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5MTIzIn0.f7WG_02UKljrMeVVOTNNBAGxtLXJUT_8QAnujNhomV18Pn5cU-0lHRgVlmRttOlqI7Iol_fHut3C4AOXxDGnAQ

    ¿Cómo puedo cambiar Uint8Array (64) para obtener la firma en un formato correcto para obtener el JWT? Probé con base64, base64url, hex, text, ascii, etc. y el JWT final no es válido (porque la firma es incorrecta). Si compara mi código con el código que mencioné con PHP es muy similar, pero la función de sodio.crypto_sign_tached devuelve Uint8Array (64) en la biblioteca JS y la misma función en PHP devuelve una cadena y puedo obtener el token. O tal vez haya una manera de adaptar mi clave privada dada para usarla en otra biblioteca (como crypto o jose donde recibí un error para el formato de clave privada) ¡Gracias!


    Solución del problema

    En el código NodeJS publicado hay los siguientes problemas:


    • crypto_sign_detached()devuelve la firma como un Uint8Array, que se puede importar Buffer.from()y convertir a una cadena Base64 con base64url().

    • La concatenación headerAndPayloadBase64URLy la firma codificada en Base64url con un .separador as proporciona el JWT que está buscando.

    • La clave privada sin procesar no debe decodificarse en ASCII, ya que esto generalmente la corrompe. En su lugar, simplemente debe manejarse como un búfer. Nota: Si es absolutamente necesaria una conversión a una cadena, utilícela 'binary'como codificación, lo que crea una cadena de bytes. Sin embargo, esto no es aplicable aquí, ya crypto_sign_detached()que no maneja cadenas de bytes.


    Con estos cambios, el siguiente código NodeJS proporciona el mismo JWT que el código PHP:

    const _sodium = require('libsodium-wrappers');
    const base64url = require("base64url");
    const getJWT = async () => {

    await _sodium.ready;
    const sodium = _sodium;
    const privateKey = "Dm2xriMD6riJagld4WCA6zWqtuWh40UzT/ZKO0pZgtHATOt0pGw90jG8BQHCE3EOjiCkFR2/gaW6JWi+3nZp8A==";
    const payload = {
    iss: "test",
    aud: "test.com",
    iat: 1650101178,
    exp: 1650101278,
    sub: "12345678-1234-1234-1234-123456789123"
    };

    const {headerAndPayloadBase64URL, keyBuf} = encode(payload, privateKey, "EdDSA");
    const signature = sodium.crypto_sign_detached(headerAndPayloadBase64URL, keyBuf);
    const signatureBase64url = base64url(Buffer.from(signature));
    console.log(`${headerAndPayloadBase64URL}.${signatureBase64url}`) // eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSJ9.eyJpc3MiOiJ0ZXN0IiwiYXVkIjoidGVzdC5jb20iLCJpYXQiOjE2NTAxMDExNzgsImV4cCI6MTY1MDEwMTI3OCwic3ViIjoiMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5MTIzIn0.f7WG_02UKljrMeVVOTNNBAGxtLXJUT_8QAnujNhomV18Pn5cU-0lHRgVlmRttOlqI7Iol_fHut3C4AOXxDGnAQ
    };
    const encode = (payload, key, alg) => {
    const header = {
    typ: "JWT",
    alg //'EdDSA'
    };
    const headerBase64URL = base64url(JSON.stringify(header));
    const payloadBase64URL = base64url(JSON.stringify(payload));
    const headerAndPayloadBase64URL = `${headerBase64URL}.${payloadBase64URL}`;
    const keyBuf = Buffer.from(key, "base64");
    return {headerAndPayloadBase64URL, keyBuf};
    };
    getJWT();

    Dado que Ed25519 es determinista, el código se puede verificar comparando ambos JWT. Para esto, por supuesto, se debe usar ese payload que también se usó al crear el JWT con el código PHP. Esto se ha tenido en cuenta en el código anterior.

    Tenga en cuenta que en lugar del momentpaquete, Date.now()podría usarse. Esto devolverá el tiempo en milisegundos, por lo que el valor debe dividirse por 1000, por ejemplo Math.round(Date.now()/1000), pero guarda una dependencia.

    JWT/EdDSA no suele ser compatible con las herramientas en línea. Una posibilidad de verificación es, por ejemplo, con Python y PyJWT (ver esta publicación ):

    import jwt
    # X.509 counterpart to the base64 encoded raw key: wEzrdKRsPdIxvAUBwhNxDo4gpBUdv4GluiVovt52afA=
    publicKey = """-----BEGIN PUBLIC KEY-----
    MCowBQYDK2VwAyEAwEzrdKRsPdIxvAUBwhNxDo4gpBUdv4GluiVovt52afA=
    -----END PUBLIC KEY-----"""
    token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSJ9.eyJpc3MiOiJ0ZXN0IiwiYXVkIjoidGVzdC5jb20iLCJpYXQiOjE2NTAxMDExNzgsImV4cCI6MTY1MDEwMTI3OCwic3ViIjoiMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5MTIzIn0.f7WG_02UKljrMeVVOTNNBAGxtLXJUT_8QAnujNhomV18Pn5cU-0lHRgVlmRttOlqI7Iol_fHut3C4AOXxDGnAQ'
    decoded = jwt.decode(token, publicKey, audience="test.com", algorithms='EdDSA', verify=True, options={"verify_exp": False})
    print(decoded) # {'iss': 'test', 'aud': 'test.com', 'iat': 1650101178, 'exp': 1650101278, 'sub': '12345678-1234-1234-1234-123456789123'}

    Sin embargo, tenga en cuenta que el token publicado expiró el sábado 16 de abril de 2022 a las 09:27:58 GMT+0000 ( exp: 1650101278), por lo que la verificación de este JWT en particular solo es posible si la verificación de la fecha de vencimiento está deshabilitada con options={"verify_exp": False}.

    Cuándo derivar el ID de usuario del token de autenticación o exponer los puntos finales REST aceptando el ID de usuario como variable de ruta o parámetros de consulta

    Supongamos que tengo un punto final REST /orders/{userId}, aquí userId es un marcador de posición dinámico que acepta la identificación del usuario. El punto final también está protegido y requiere que se pase un token de autenticación para acceder a él. Entonces, ¿cuál es el enfoque preferido?


    • eliminar la variable de ruta de ID de usuario y simplemente obtener la identificación de usuario del token?

    • ¿No es necesario derivar la identificación de usuario del token y simplemente usar el valor de la variable de ruta?

    • usar ambos, validarlos y hacer lo requerido (en cuanto al rendimiento, ¿es esto bueno)?


    Sugiera el enfoque para manejar este escenario. El requisito es que los usuarios solo puedan acceder a sus propios recursos, mientras que el administrador puede acceder a todo.


    Solución del problema

    Si coloca la identificación en el token, primero debe averiguar el nombre de usuario actual y luego debe verificar si el usuario es administrador o no, pero si pasa la identificación del usuario como una variable de ruta, solo necesita verificar el rol de si este usuario es administrador o no. Por lo tanto, si tiene la identificación de usuario y es segura, solo debe usar el enfoque de variable de ruta en lugar de encontrar al usuario por token.

    privado[esto] vs privado

    En Scala veo una característica como variable privada de objeto. Desde mi experiencia en Java no muy rica, aprendí a cerrar todo (hacerlo privado) y abrirlo (proporcionar accesores) si es necesario. Scala introduce un modificador de acceso aún más estricto. ¿Debería usarlo siempre por defecto? ¿O debería usarlo solo en algunos casos específicos en los que necesito restringir explícitamente el cambio de valor de campo incluso para objetos de la misma clase? En otras palabras, ¿cómo debo elegir entre

    class Dummy {
    private var name = "default name"
    }
    class Dummy {
    private[this] var name = "default name"
    }

    El segundo es más estricto y me gusta, pero ¿debería usarlo siempre o solo si tengo una razón de peso?

    EDITADO: Como veo aquí, private[this] es solo un subcaso y en lugar de thispuedo usar otros modificadores: "paquete, clase u objeto único". Así que lo dejaré para algún caso especial.


    Solución del problema

    En la mayoría de los lenguajes de programación OOP como Java, los campos/métodos privados significan que estos campos/métodos privados no son accesibles fuera de la clase. Sin embargo, las instancias/objetos de la misma clase pueden tener acceso a los campos privados de los objetos mediante el operador de asignación o mediante el constructor de copias. En Scala, private[this] es un objeto privado, lo que garantiza que cualquier otro objeto de la misma clase no pueda acceder a los miembros de private[this].

    Ejemplo

    1.Sin privado[esto]

    object ObjectPrivateDemo {
    def main(args: Array[String]) {
    var real = new User("realUserName", "realPassword")
    var guest = new User("dummyUserName", "dummyPassword")
    real.displayUser(guest)
    }
    }
    class User(val username:String,val password:String) {
    private var _username=username
    private var _password=password
    def displayUser(guest:User){
    println(" guest username="+guest._username+" guest password="+guest._password)
    guest._username= this._username
    guest._password= this._password
    println(" guest username="+guest._username+" guest password="+guest._password)
    }
    }

    2.Usando privado[esto]

    class User(val username: String, val password: String) {
    private var _username = username
    private[this] var _password = password
    def displayUser(guest: User) {
    println(this._username)
    println(this._password)
    guest._username = this._username
    // for guest._password it will give this:error value _password is not member of class User
    guest._password = this._password
    }
    }

    Por lo tanto, private[this] se asegura de que el campo _password solo sea accesible con this.

    Cómo solucionar la excepción "System.Management solo es compatible con las aplicaciones de escritorio de Windows"

    La cuestión:

    Nuestra aplicación es una aplicación de escritorio de Windows.NET 5. La capacidad de licencia requiere que la aplicación use el componente System.Management de NuGet para crear una identificación de dispositivo única a partir de la identificación del procesador del sistema, la dirección MAC y el número de serie del BIOS.

    Todo esto funcionó muy bien al probarlo desde el depurador de Visual Studio. Sin embargo, al agregar System.Management.dll al instalador de la aplicación (instalador de InstallShield), naturalmente, seleccioné la versión de System.Management.dll que estaba en la carpeta de destino de compilación de la aplicación. Resulta que la versión de la DLL que termina en esa carpeta es una versión no operativa que arroja excepciones no admitidas que dicen "System.Management solo es compatible con las aplicaciones de escritorio de Windows".


    Solución del problema

    La solución:

    Encontré la versión correcta de System.Management.dll en la carpeta TargetFolder \runtimes\win\lib\ netcoreapp X.x. En mi caso, como estoy usando System.Management versión 6.0, está en la carpeta "netcoreapp3.1".

    Conclusión

    Hay muchos casos en los que Microsoft no hace lo correcto. En este caso, mi aplicación era específicamente una aplicación de escritorio de Windows.NET 5, por lo que todos pensaríamos que msbuild podría averiguar qué hacer correctamente. No tan. En tal caso, al menos hubiera esperado que.NET Foundation hubiera proporcionado información al respecto. ¡Bueno, ahora todos ustedes también lo saben!

    Salud

    NameCheap de dominios personalizados de Google Cloud - "WWW" no funciona

    He comprado un dominio en https://www.namecheap.com/. También tengo un servicio Cloud Run ejecutándose en Google Cloud. Verifiqué mi dominio en Google y lo agregué como Dominio personalizado. A cambio, Google me dio los registros DNS.registros dns

    Todo lo que tenía que hacer era ir a NameCheap y agregar estos registros, lo cual hice.
    ipv4

    ipv6

    Puedo acceder al sitio web de mi sitio como este https://abcd.com pero no como este https://www.abcd.com con (WWW). ¿Alguna idea de por qué?


    Solución del problema

    Agregue un registro CNAME para dar cuenta de un prefijo a su nombre de dominio (por ejemplo, www.):

  • Haga clic en Agregar conjunto de registros.

  • En el campo Nombre DNS, agregue el prefijo www para el dominio.

  • Para Tipo de registro de recurso, elija CNAME.

  • Para Nombre canónico, ingrese el nombre de dominio, seguido de un punto (por ejemplo, ejemplo.com.).

  • Haz clic en Crear.

  • Consulte este documento.

    ¿Archivo CSV a una matriz a una tabla? (Pitón 3.10.4)

    Soy nuevo en Python y estoy aprendiendo algo basado en proyectos. Tengo un archivo CSV que puse en una matriz pero me gustaría presentarlo en PrettyTable

    Esto es lo que tengo hasta ahora:

    import csv
    import numpy as np
    with open('destiny.csv', 'r') as f:
    data = list(csv.reader(f, delimiter=";"))
    data = np.array(data)

    La salida es esta:

     ['Loud Lullaby,Aggressive,Moon,Kinetic,120,Legendary,hand_cannon']
    ['Pribina-D,Aggressive,Gunsmith,Kinetic,120,Legendary,hand_cannon']
    ['True Prophecy,Aggressive,World,Kinetic,120,Legendary,hand_cannon']
    ['Igneous Hammer,Aggressive,Trials,Solar,120,Legendary,hand_cannon']

    Pero me gustaría meterlo en esto:

    from prettytable import PrettyTable
    myTable = PrettyTable(['Gun Name', 'Archetype', 'Source', 'Element', 'Rounds Per Minute', 'Rarity', 'Weapon Type'])
    myTable.add_row(['Loud Lullaby', 'Aggressive', 'Moon', 'Kinetic', '120', 'Legendary', 'Hand Cannon'])
    myTable.add_row(["Pribina-D", "Aggressive", "Gunsmith", "Kinetic", "120", "Legendary", "Hand Cannon"])
    myTable.add_row(["True Prophecy", "Aggressive", "World", "Kinetic", "120", "Legendary", "Hand Cannon"])
    myTable.add_row(["Igneous Hammer", "Aggressive", "Trials", "Solar", "120", "Legendary", "Hand Cannon"])

    Entonces puede verse así:

     Gun Name | Archetype | Source | Element | Rounds Per Minute | Rarity | Weapon Type |
    +---------------------------------+--------------+---------------+---------+-------------------+-----------+-------------+
    | Loud Lullaby | Aggressive | Moon | Kinetic | 120 | Legendary | Hand Cannon |
    | Pribina-D | Aggressive | Gunsmith | Kinetic | 120 | Legendary | Hand Cannon |
    | True Prophecy | Aggressive | World | Kinetic | 120 | Legendary | Hand Cannon |
    | Igneous Hammer | Aggressive | Trials | Solar | 120 | Legendary | Hand Cannon |

    ¿Pensamientos sobre la mejor manera de incorporar el conjunto de datos en la tabla sin tener que copiar y pegar cada línea en myTable.add_row? Porque hay cientos de líneas...

    [Crédito a vishwasrao99 en Kaggle por este archivo CSV]


    Solución del problema

    Acabo de combinar tus dos piezas de guión:


    import csv
    import numpy as np
    from prettytable import PrettyTable
    with open('destiny.csv', 'r') as f:
    data = list(csv.reader(f, delimiter=";"))
    data = np.array(data)
    columns = ['Gun Name', 'Archetype', 'Source', 'Element', 'Rounds Per Minute', 'Rarity', 'Weapon Type']
    myTable = PrettyTable(columns)
    for row in data:
    list = row[0].split(",")
    myTable.add_row(list)
    print(myTable)

    Tenga en cuenta que usé split (",") para dividir las cadenas que obtiene en su matriz numpy en cada coma, creando listas idénticas a las que ingresa manualmente en su ejemplo.

    cómo recopilar el pk del modelo que está viendo actualmente (django)

    oye estoy tratando de hacer un proyecto de preguntas y respuestas para django, como obtengo el pk de la pregunta que estoy viendo ahora mismo para enviar una respuesta? Ya lo configuré para que la URL de la respuesta tenga /respuesta/pk de la pregunta, pero no sé cómo obtener esa información para que el código sepa dónde publicar el modelo, ¿cómo hago eso? también aquí está mi código, gracias!

    puntos de vista:

    class AnswerForm(SuccessMessageMixin, CreateView):
    template_name = 'forum/answer-question.html'
    model = Answer
    form_class = AnswerForm
    success_message = 'Success!'

    def form_valid(self, form, pk=None):
    form.instance.question_id = Question.objects.only('id')
    form.instance.user = self.request.user
    form.save()
    return super().form_valid(form)

    formas:

    class AnswerForm(ModelForm):
    class Meta:
    model = Answer
    fields = ['detail']
    exclude = ('user', 'add_time')

    direcciones URL:

    desde django.urls ruta de importación desde. importar vistas

    urlpatterns = [
    path('questions/', views.QuestionsView.as_view(), name='questions'),
    path('ask/', views.AskForm.as_view(), name='ask'),
    path('answer/', views.AnswerForm.as_view(), name='answer'),
    path('answer/<pk>', views.AnswerForm.as_view(), name='answer_with_pk'),
    path('question/<pk>', views.QuestionDetailView.as_view(), name='detail'),
    path('save-text', views.WriteCommentAnswerView.as_view(), name='save-text'),
    path('save-vote', views.SaveVoteView.as_view(), name='save-vote'),
    ]

    modelos:

    class Answer(VoteModel, models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    detail = models.TextField()
    add_time = models.DateTimeField(auto_now_add=True)

    def get_absolute_url(self):
    return f"/questions/"
    def __str__(self):
    return self.detail


    Solución del problema

    En AnswerForm, obtiene todos los parámetros de URL agregados a sí mismo debido a la vista detallada de la clase base. En su caso, "self.pk". Luego puede agregar cualquier cosa al contexto para la representación html implementando get_context_data:

    def get_context_data(self, **kwargs):
    # Call the base implementation first to get a context
    context = super().get_context_data(**kwargs)
    # Add in the publisher
    context['question_pk'] = self.pk
    return context

    Consulte https://docs.djangoproject.com/en/4.0/topics/class-based-views/generic-display/

    viernes, 29 de abril de 2022

    ¿Dónde está el archivo /opt/bitnami/airflow/airflow. cfg ubicado en mi máquina? [cerrado]

    Cerrado. Esta pregunta no cumple con las pautas de desbordamiento de pila. Actualmente no está aceptando respuestas.


    Solución del problema

    Tendrá que derivar eso de su imagen acoplable, si no ha especificado una imagen personalizada. Para encontrar el archivo, puede iniciar sesión en la terminal de cualquiera de los contenedores de flujo de aire y verificar el archivo.

    1. docker ps # notice the names folder and copy any of the names of airflow images
    2. docker exec -it <name_from_staep_1> bash
    3. cd /opt/bitnami/airflow/
    4. ls airflow.cfg

    Swift: concatene dos matrices sin duplicar el sufijo/prefijo compartido

    Tengo una situación en la que necesito unir dos matrices que a menudo tienen un subarreglo superpuesto.

    Entonces si tengo:

    let input1 = ["A", "B", "F", "E"]

    y

    let input2 = ["F", "E", "A", "G"]

    el resultado debe ser:

    let result = ["A", "B", "F", "E", "A", "G"]

    Entonces, es un poco como una "unión" en el sentido de que la salida no duplica el subarreglo/intersección compartido y contiene ambos arreglos en su estado original (solo superpuestos/intersectados). La forma canónica de hacer algo similar es con Conjuntos, pero eso eliminaría la segunda "A".


    Solución del problema

    Solo por diversión, puede usar comienza con predicado mientras itera su primera secuencia desde el final de la siguiente manera:

    let first: [String] = ["A", "B", "F", "E"]
    let second: [String] = ["F", "E", "A", "G"]
    var pos = first.endIndex
    while pos > first.startIndex,
    second.starts(with: first[pos...], by: { $0!= $1}),
    !second.isEmpty {
    first.formIndex(before: &pos)
    }
    let result = first[..<pos] + second // ["A", "B", "F", "E", "A", "G"]

    Esto dará como resultado una subsecuencia, en este caso un segmento de matriz. Si necesita una matriz, simplemente establezca explícitamente el tipo resultante:

    let result: [String] = first[..<pos] + second

    Según los comentarios de OP, si necesita hacer coincidir la subsecuencia por pares, simplemente compense cada dos elementos:

    let first = "ABFF"
    let second = "FFAG"
    var pos = first.endIndex
    while pos > first.startIndex,
    second.starts(with: first[pos...], by: { $0!= $1 }),
    !second.isEmpty {
    first.formIndex(&pos, offsetBy: -2)
    }
    let result: String = first[..<pos] + second // "ABFFAG"

    Si necesita los elementos de cadena separados por espacios:

    var first = "A B C D E F G D E"
    var second = "D E F C B A"
    first.removeAll(where: \.isWhitespace)
    second.removeAll(where: \.isWhitespace)
    var pos = first.endIndex
    while pos > first.startIndex,
    second.starts(with: first[pos...], by: { $0!= $1 }),
    !second.isEmpty {
    first.formIndex(&pos, offsetBy: -2)
    }
    let result = (first[..<pos] + second)
    .map(String.init)
    .joined(separator: " ")
    result // "A B C D E F G D E F C B A"

    ¿Qué significa "to stub" en la programación?

    Por ejemplo, ¿qué significa en esta cita?

    La integración con una API externa es casi una garantía en cualquier aplicación web moderna. Para probar dicha integración de manera efectiva, debe apagarla. Un buen stub debe ser fácil de crear y estar constantemente actualizado con las respuestas API actuales y reales. En esta publicación, describiremos una estrategia de prueba usando stubs para una API externa.


    Solución del problema

    Un stub es un reemplazo controlable para una Dependencia existente (o colaborador) en el sistema. Al usar un código auxiliar, puede probar su código sin tener que lidiar con la dependencia directamente.

    Dependencia externa - Dependencia existente:
    es un objeto en su sistema con el que interactúa su código bajo prueba y sobre el cual no tiene control. (Ejemplos comunes son sistemas de archivos, subprocesos, memoria, tiempo, etc.)


    Por ejemplo en el siguiente código:

    public void Analyze(string filename)
    {
    if(filename.Length>8)
    {
    try
    {
    errorService.LogError("long file entered named:" + filename);
    }
    catch (Exception e)
    {
    mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
    }
    }
    }

    Desea probar el método mailService.SendEMail(), pero para hacerlo necesita simular una excepción en su método de prueba, por lo que solo necesita crear un objeto Fake Stub errorService para simular el resultado que desea, luego su código de prueba será capaz de probar el método mailService.SendEMail(). Como puede ver, necesita simular un resultado que proviene de otra dependencia que es un objeto de clase ErrorService (objeto de dependencia existente).

    pip no puede instalar ningún paquete o incluso actualizar

    ingrese la descripción de la imagen aquí

    Soy nuevo en Linux. Cuando instalo CentOS-7-x86_64-Minimal-2009 a través de VM, yum install python y pip, ocurrió el problema. mi historial de línea de comando
    ingrese la descripción de la imagen aquí


    Solución del problema

    ¿Tal vez intente agregar sudo antes? Podría ayudar...

    ¿Cómo valido una carga JSON en OpenAPI 3.0 con Mule 4.4 Runtime?

    Necesito desarrollar una API Mule (4.4 Runtime) con openapi: 3.0.0 El punto final es un POST con la siguiente carga de solicitud:

    {
    "Employee": {
    "Address": {
    "City": "a",
    "Country": "aaa"
    }
    }
    }

    Aquí está la sección relevante de la especificación OpenAPI 3.0:

     openapi: "3.0.0"
    paths:
    /search:
    post:
    tags:
    - SearchUser
    summary: Search for Users
    operationId: getUser
    requestBody:
    description: User Request Object
    content:
    application/json:
    schema:
    $ref: '#/components/schemas/RequestComp'
    required: true
    responses:
    '200':
    description: successful operation
    content:
    application/json:
    schema:
    type: array
    items:
    $ref: '#/components/schemas/ResponseComp'
    '400':
    description: Bad request
    content: {}
    '404':
    description: User not found
    content: {}
    '405':
    description: Validation exception
    content: {}

    components:
    schemas:
    RequestComp:
    type: object
    properties:
    Employee:
    $ref: '#/components/schemas/EmployeeComp'
    EmployeeComp:
    type: object
    properties:
    Address:
    $ref: '#/components/schemas/AddressComp'
    AddressComp:
    type: object
    properties:
    City:
    type: string
    required: true
    nullable: false
    minLength: 1
    Country:
    type: string
    required: true
    nullable: false
    minLength: 1
    ResponseComp:
    type: object
    properties:
    City:
    type: string
    Country:
    type: string

    Entonces, puedo validar elementos individuales como 'Ciudad' y 'País' para que no sean nulos, pero ¿cómo evito seguir la solicitud? (actualmente no está marcado como no válido:)

     {
    "Address": {
    "City": "a",
    "Country": "aaa"
    }
    }


    Solución del problema

    Puede definir el Employeecontenedor como una propiedad requerida y también rechazar propiedades desconocidas agregando additionalProperties: false. Tenga en cuenta que no requiredes un atributo de nivel de propiedad, sino un atributo de nivel de objeto: es una lista de propiedades requeridas.

    components:
    schemas:
    RequestComp:
    type: object
    required: [Employee] # <-----
    properties:
    Employee:
    $ref: '#/components/schemas/EmployeeComp'
    additionalProperties: false # <-----
    EmployeeComp:
    type: object
    properties:
    Address:
    $ref: '#/components/schemas/AddressComp'
    additionalProperties: false # <-----
    AddressComp:
    type: object
    required: [City, Country] # <-----
    properties:
    City:
    type: string
    # required: true # <-- remove this
    nullable: false
    minLength: 1
    Country:
    type: string
    # required: true # <-- remove this
    nullable: false
    minLength: 1
    additionalProperties: false # <-----

    Cómo llamar a una función JS usando el evento OnClick

    Estoy tratando de llamar a mi función JS que agregué en el encabezado. Encuentre el código a continuación que muestra el escenario de mi problema. Nota: No tengo acceso al cuerpo de mi aplicación. Cada vez que hago clic en el elemento con id="Save"solo llama f1()pero no fun(). ¿Cómo puedo hacer que llame incluso a mi fun()? Por favor ayuda.

     <!DOCTYPE html>
    <html>
    <head>
    <script>
    document.getElementById("Save").onclick = function fun()
    {
    alert("hello");
    //validation code to see State field is mandatory.
    }
    function f1()
    {
    alert("f1 called");
    //form validation that recalls the page showing with supplied inputs.
    }
    </script>
    </head>
    <body>
    <form name="form1" id="form1" method="post">
    State:
    <select id="state ID">
    <option></option>
    <option value="ap">ap</option>
    <option value="bp">bp</option>
    </select>
    </form>
    <table><tr><td id="Save" onclick="f1()">click</td></tr></table>
    </body>
    </html>


    Solución del problema

    Está intentando adjuntar una función de escucha de eventos antes de que se cargue el elemento. Coloque fun()dentro de una onloadfunción de escucha de eventos. Llame f1()dentro de esta función, ya onclickque se ignorará el atributo.

    function f1() {
    alert("f1 called");
    //form validation that recalls the page showing with supplied inputs.
    }
    window.onload = function() {
    document.getElementById("Save").onclick = function fun() {
    alert("hello");
    f1();
    //validation code to see State field is mandatory.
    }
    }

    JSFiddle

    ¿Cómo hacer un fondo de mosaico en un lienzo en python usando tkinter?

    esencialmente, este fragmento de código me da una imagen, me gustaría hacerlo de alguna manera para que la imagen se repita en un formato de cuadrícula según la cantidad de columnas que definí. ¿Cómo haría esto usando un bucle for?

    fragmento de código:

    canvas = Canvas(row, width = ncols*square_width, height = ncols*square_height,
    bg = bg_color, bd=0, highlightthickness=0, relief='ridge')
    canvas.create_image(0, 0, image = im_Empty, anchor = 'nw')
    canvas.update()
    canvas.pack()


    Solución del problema

    Recomendaría simplemente crear un marco y luego colocar estos lienzos en el marco usando la cuadrícula integrada(), a continuación hay un ejemplo funcional de un programa que crea una cuadrícula de lienzos de 5 por 5 usando su función de creación de lienzos (con algunos cambios ):


    import tkinter as tk
    from tkinter import ttk
    def createCanvas(frame,nrow,ncolumn):
    ncols = 5
    square_width = 5
    square_height = 5
    bg_color = "red"
    im_Empty = tk.PhotoImage(file="gifsample.gif")
    canvas = tk.Canvas(frame, width = ncols*square_width, height = ncols*square_height, \
    bg = bg_color, bd=0, highlightthickness=0, relief='ridge')
    canvas.create_image(0, 0, image = im_Empty, anchor = 'nw')
    canvas.update()
    canvas.grid(row = nrow, column = ncolumn, sticky = "nsew")
    return canvas
    root = tk.Tk()
    frame = tk.Frame(root)
    frame.grid(row = 0, column = 0, sticky = "nsew")
    frame.grid_rowconfigure(0, weight=1)
    frame.grid_columnconfigure(0, weight=1)
    canvases = dict()
    columns = 5
    rows = 6
    for i in range(rows):
    for j in range(columns):
    canvases[str(i)+","+str(j)] = createCanvas(frame,i,j)
    frame.grid_rowconfigure(i, weight=1)
    frame.grid_columnconfigure(j, weight=1)
    print(canvases)
    root.mainloop()

    Tenga en cuenta que creé un diccionario como contenedor para estos lienzos cuadriculados, ya que es posible que desee mantener las referencias almacenadas, pero técnicamente hablando, también puede crear los lienzos sin el dictado.

    Además, para mí, la imagen no apareció, pero te dejaré la depuración, ya que no era realmente lo que estabas preguntando.

    reinicio del servicio con buildozer no puedo encontrar la clase?

    Solución del problema

    Arreglé algunas líneas y limpié mi buildozer:

    esta es la versión de trabajo completa de mi buildozer.spec:

    [app]
    # (str) Title of your application
    title = ser
    # (str) Package name
    package.name = ser
    # (str) Package domain (needed for android/ios packaging)
    package.domain = org.pck
    # (str) Source code where the main.py live
    source.dir =.
    # (list) Source files to include (let empty to include all the files)
    source.include_exts = py,png,jpg,kv,atlas,db,ttf,wav
    # (list) List of inclusions using pattern matching
    source.include_patterns = cache/*.png,fonts/cello-sans/*.ttf,fonts/fondation/*.ttf
    # (list) Source files to exclude (let empty to not exclude anything)
    #source.exclude_exts = spec
    # (list) List of directory to exclude (let empty to not exclude anything)
    #source.exclude_dirs = tests, bin
    # (list) List of exclusions using pattern matching
    #source.exclude_patterns = license,images/*/*.jpg
    # (str) Application versioning (method 1)
    version = 0.1
    # (str) Application versioning (method 2)
    # version.regex = __version__ = ['"](.*)['"]
    # version.filename = %(source.dir)s/main.py
    # (list) Application requirements
    # comma separated e.g. requirements = sqlite3,kivy
    #requirements = python3,Kivy-Garden==0.1.1,futures==2.1.6,requests==1.2.3,certifi,urllib3,chardet,idna
    #requirements = python3,kivy==2.0.0,kivymd==0.104.2,numpy,pillow,kivy_garden.mapview,requests,charset_normalizer,chardet,idna, urllib3,certifi,plyer==2.0.0,sqlite3,pickle-mixin,kivygradient,jnius,android
    requirements = python3,kivy==2.0.0,kivymd==0.104.2,numpy,pillow,kivy_garden.mapview,requests,charset_normalizer,chardet,idna, urllib3,certifi,plyer==2.0.0,sqlite3,pickle-mixin,kivygradient,android
    # (str) Custom source folders for requirements
    # Sets custom source for any requirements with recipes
    # requirements.source.kivy =../../kivy
    # (list) Garden requirements
    #garden_requirements = kivy.garden.mapview
    # (str) Presplash of the application
    #presplash.filename = presplash.png
    # (str) Icon of the application
    #icon.filename = icon.png
    # (str) Supported orientation (one of landscape, sensorLandscape, portrait or all)
    orientation = portrait
    # (list) List of service to declare
    #services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY
    services = Worker:service.py
    #
    # OSX Specific
    #
    #
    # author = © Copyright Info
    # change the major version of python used by the app
    osx.python_version = 3
    # Kivy version to use
    osx.kivy_version = 1.9.1
    #
    # Android specific
    #
    # (bool) Indicate if the application should be fullscreen or not
    fullscreen = 0
    # (string) Presplash background color (for new android toolchain)
    # Supported formats are: #RRGGBB #AARRGGBB or one of the following names:
    # red, blue, green, black, white, gray, cyan, magenta, yellow, lightgray,
    # darkgray, grey, lightgrey, darkgrey, aqua, fuchsia, lime, maroon, navy,
    # olive, purple, silver, teal.
    #android.presplash_color = #FFFFFF
    # (list) Permissions
    android.permissions = INTERNET, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION, FOREGROUND_SERVICE
    # (int) Target Android API, should be as high as possible.
    #android.api = 27
    # (int) Minimum API your APK will support.
    #android.minapi = 21
    # (int) Android SDK version to use
    #android.sdk = 20
    # (str) Android NDK version to use
    #android.ndk = 19b
    # (int) Android NDK API to use. This is the minimum API your app will support, it should usually match android.minapi.
    #android.ndk_api = 21
    # (bool) Use --private data storage (True) or --dir public storage (False)
    #android.private_storage = True
    # (str) Android NDK directory (if empty, it will be automatically downloaded.)
    #android.ndk_path =
    # (str) Android SDK directory (if empty, it will be automatically downloaded.)
    #android.sdk_path =
    # (str) ANT directory (if empty, it will be automatically downloaded.)
    #android.ant_path =
    # (bool) If True, then skip trying to update the Android sdk
    # This can be useful to avoid excess Internet downloads or save time
    # when an update is due and you just want to test/build your package
    # android.skip_update = False
    # (bool) If True, then automatically accept SDK license
    # agreements. This is intended for automation only. If set to False,
    # the default, you will be shown the license when first running
    # buildozer.
    # android.accept_sdk_license = False
    # (str) Android entry point, default is ok for Kivy-based app
    #android.entrypoint = org.renpy.android.PythonActivity
    # (str) Android app theme, default is ok for Kivy-based app
    # android.apptheme = "@android:style/Theme.NoTitleBar"
    # (list) Pattern to whitelist for the whole project
    #android.whitelist =
    # (str) Path to a custom whitelist file
    #android.whitelist_src =
    # (str) Path to a custom blacklist file
    #android.blacklist_src =
    # (list) List of Java.jar files to add to the libs so that pyjnius can access
    # their classes. Don't add jars that you do not need, since extra jars can slow
    # down the build process. Allows wildcards matching, for example:
    # OUYA-ODK/libs/*.jar
    #android.add_jars = foo.jar,bar.jar,path/to/more/*.jar
    # (list) List of Java files to add to the android project (can be java or a
    # directory containing the files)
    #android.add_src =
    # (list) Android AAR archives to add (currently works only with sdl2_gradle
    # bootstrap)
    #android.add_aars =
    # (list) Gradle dependencies to add (currently works only with sdl2_gradle
    # bootstrap)
    #android.gradle_dependencies =
    # (list) add java compile options
    # this can for example be necessary when importing certain java libraries using the 'android.gradle_dependencies' option
    # see https://developer.android.com/studio/write/java8-support for further information
    # android.add_compile_options = "sourceCompatibility = 1.8", "targetCompatibility = 1.8"
    # (list) Gradle repositories to add {can be necessary for some android.gradle_dependencies}
    # please enclose in double quotes
    # e.g. android.gradle_repositories = "maven { url 'https://kotlin.bintray.com/ktor' }"
    #android.add_gradle_repositories =
    # (list) packaging options to add
    # see https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html
    # can be necessary to solve conflicts in gradle_dependencies
    # please enclose in double quotes
    # e.g. android.add_packaging_options = "exclude 'META-INF/common.kotlin_module'", "exclude 'META-INF/*.kotlin_module'"
    #android.add_gradle_repositories =
    # (list) Java classes to add as activities to the manifest.
    #android.add_activities = com.example.ExampleActivity
    # (str) OUYA Console category. Should be one of GAME or APP
    # If you leave this blank, OUYA support will not be enabled
    #android.ouya.category = GAME
    # (str) Filename of OUYA Console icon. It must be a 732x412 png image.
    #android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png
    # (str) XML file to include as an intent filters in <activity> tag
    #android.manifest.intent_filters =
    # (str) launchMode to set for the main activity
    #android.manifest.launch_mode = standard
    # (list) Android additional libraries to copy into libs/armeabi
    #android.add_libs_armeabi = libs/android/*.so
    #android.add_libs_armeabi_v7a = libs/android-v7/*.so
    #android.add_libs_arm64_v8a = libs/android-v8/*.so
    #android.add_libs_x86 = libs/android-x86/*.so
    #android.add_libs_mips = libs/android-mips/*.so
    # (bool) Indicate whether the screen should stay on
    # Don't forget to add the WAKE_LOCK permission if you set this to True
    #android.wakelock = False
    # (list) Android application meta-data to set (key=value format)
    #android.meta_data =
    # (list) Android library project to add (will be added in the
    # project.properties automatically.)
    #android.library_references =
    # (list) Android shared libraries which will be added to AndroidManifest.xml using <uses-library> tag
    #android.uses_library =
    # (str) Android logcat filters to use
    android.logcat_filters = *:S python:D
    # (bool) Copy library instead of making a libpymodules.so
    #android.copy_libs = 1
    # (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64
    android.arch = armeabi-v7a
    # (int) overrides automatic versionCode computation (used in build.gradle)
    # this is not the same as app version and should only be edited if you know what you're doing
    # android.numeric_version = 1
    #
    # Python for android (p4a) specific
    #
    # (str) python-for-android fork to use, defaults to upstream (kivy)
    #p4a.fork = kivy
    # (str) python-for-android branch to use, defaults to master
    #p4a.branch = master
    # (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)
    #p4a.source_dir =
    # (str) The directory in which python-for-android should look for your own build recipes (if any)
    #p4a.local_recipes =
    # (str) Filename to the hook for p4a
    #p4a.hook =
    # (str) Bootstrap to use for android builds
    # p4a.bootstrap = sdl2
    # (int) port number to specify an explicit --port= p4a argument (eg for bootstrap flask)
    #p4a.port =
    #
    # iOS specific
    #
    # (str) Path to a custom kivy-ios folder
    #ios.kivy_ios_dir =../kivy-ios
    # Alternately, specify the URL and branch of a git checkout:
    ios.kivy_ios_url = https://github.com/kivy/kivy-ios
    ios.kivy_ios_branch = master
    # Another platform dependency: ios-deploy
    # Uncomment to use a custom checkout
    #ios.ios_deploy_dir =../ios_deploy
    # Or specify URL and branch
    ios.ios_deploy_url = https://github.com/phonegap/ios-deploy
    ios.ios_deploy_branch = 1.7.0
    # (str) Name of the certificate to use for signing the debug version
    # Get a list of available identities: buildozer ios list_identities
    #ios.codesign.debug = "iPhone Developer: <lastname> <firstname> (<hexstring>)"
    # (str) Name of the certificate to use for signing the release version
    #ios.codesign.release = %(ios.codesign.debug)s
    [buildozer]
    # (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))
    log_level = 2
    # (int) Display warning if buildozer is run as root (0 = False, 1 = True)
    warn_on_root = 1
    # (str) Path to build artifact storage, absolute or relative to spec file
    # build_dir =./.buildozer
    # (str) Path to build output (i.e..apk,.ipa) storage
    # bin_dir =./bin
    # -----------------------------------------------------------------------------
    # List as sections
    #
    # You can define all the "list" as [section:key].
    # Each line will be considered as a option to the list.
    # Let's take [app] / source.exclude_patterns.
    # Instead of doing:
    #
    #[app]
    #source.exclude_patterns = license,data/audio/*.wav,data/images/original/*
    #
    # This can be translated into:
    #
    #[app:source.exclude_patterns]
    #license
    #data/audio/*.wav
    #data/images/original/*
    #
    # -----------------------------------------------------------------------------
    # Profiles
    #
    # You can extend section / key with a profile
    # For example, you want to deploy a demo version of your application without
    # HD content. You could first change the title to add "(demo)" in the name
    # and extend the excluded directories to remove the HD content.
    #
    #[app@demo]
    #title = My Application (demo)
    #
    #[app:source.exclude_patterns@demo]
    #images/hd/*
    #
    # Then, invoke the command line with the "demo" profile:
    #
    #buildozer --profile demo android debug

    esto es principal.py:

    import kivy
    import platform
    from kivy.app import App
    from kivy.uix.label import Label
    from kivy.uix.button import Button
    from jnius import autoclass
    from multiprocessing.dummy import Process
    from kivy.uix.widget import Widget
    import jnius
    from kivy.clock import Clock
    from kivy.uix.image import Image
    from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
    class fscreen(Widget):
    def __init__(self, **kwargs):
    super().__init__(**kwargs)


    class theapp(App):
    def build(self):
    self.cnt = 0
    self.screenm = ScreenManager() #(transition=FadeTransition())
    self.fscreen = fscreen()
    screen = Screen(name = "first screen")
    screen.add_widget(self.fscreen)
    self.screenm.add_widget(screen)
    return self.screenm
    def change(self, *args):
    self.cnt += 1
    self.fscreen.ids.lb.text = str(self.cnt) + ' hello '
    print(str(self.cnt) + ' hello ')
    def label_update(self):
    Clock.schedule_interval(self.change, 1)
    def on_start(self):
    from kivy import platform
    if platform == "android":
    self.start_service()
    print('service started')
    Process(target=self.label_update).start()
    #@staticmethod
    def start_service(self):
    from android import mActivity
    context = mActivity.getApplicationContext()
    SERVICE_NAME = str(context.getPackageName()) + '.Service' + 'Worker'
    service = autoclass(SERVICE_NAME)
    print(SERVICE_NAME)
    service.start(mActivity,'')
    return service
    print('returned service')
    if __name__ == "__main__":
    theapp = theapp()
    theapp.run()


    y este servicio.py:

    import kivy
    from kivy.app import App
    from kivy.uix.screenmanager import ScreenManager, Screen
    from kivy.uix.widget import Widget
    from jnius import autoclass
    import time
    PythonService = autoclass('org.kivy.android.PythonService')
    PythonService.mService.setAutoRestartService(True)
    while True:
    print('this is my service and its running')
    time.sleep(1)

    y este es el gato despues adb logcat -s Worker:

    04-16 03:38:08.882 26990 27006 I Worker: this is my service and its running
    04-16 03:38:09.884 26990 27006 I Worker: this is my service and its running

    Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

    Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...