AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / 问题

All perguntas(coding)

Martin Hope
KevinS
Asked: 2025-04-08 16:42:34 +0800 CST

Como excluir linhas em massa no Postgresql com uma cláusula where que pode conter valores nulos usando Spring JDBC

  • 7

No Postgres, usando o NamedParameterJdbcTemplate do Spring JDBC, se eu quiser excluir uma linha usando uma cláusula where que pode incluir um valor nulo, tenho que fazer algo assim...

val sql = if (someOtherValue == null) {
    "delete from some_table where some_column = :someValue and some_other_column is null"
} else {
    "delete from some_table where some_column = :someValue and some_other_column = :someOtherValue"
}

Se eu quiser fazer uma exclusão em massa de uma coleção de entradas onde alguns dos someOtherValues podem ser nulos, existe alguma maneira de fazer isso em uma única instrução SQL? Ou preciso dividir minha coleção em registros que contêm um nulo someOtherValuee aqueles que não contêm?

sql
  • 2 respostas
  • 41 Views
Martin Hope
Jepessen
Asked: 2025-04-08 16:25:56 +0800 CST

Mostrar o valor `boost::uuids::uuid` no depurador do Visual Studio com Natvis

  • 6

Em um projeto de biblioteca CMake, tenho uma classe que é basicamente um wrapper para boost::uuids::uuid:

class UUID {
public:

  static bool IsValidUUIDText(std::string_view text);
  static UUID CreateNull();

public:

  UUID();
  UUID(const UUID& other);
   UUID(UUID&& other);
  UUID(std::string_view id);
  UUID(const std::array<uint8_t, 16>& byteArray);
  ~UUID();

  std::string getText() const;
  std::array<uint8_t, 16> getByteArray() const;
   size_t getHash() const;

public:

  bool operator==(const UUID& other) const;
  bool operator!=(const UUID& other) const;
  bool operator<(const UUID& other) const;
  bool operator>(const UUID& other) const;
  bool operator<=(const UUID& other) const;
  bool operator>=(const UUID& other) const;
  UUID& operator=(const UUID& other);
  UUID& operator=(UUID&& other) noexcept;

private:

  boost::uuids::uuid* m_uuid{ nullptr };
};

inline std::ostream& operator<<(std::ostream& os, const UUID& uuid) {
  os << uuid.getText();
  return os;
}

Gostaria de mostrar o valor do UUID nas janelas do depurador do Visual Studio (Locals, por exemplo). Então, criei um arquivo .natvis seguindo este outro tópico e o coloquei em uma resourcespasta no meu projeto CMake.

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="boost::uuids::uuid">
    <DisplayString>{{{data[0],nvoXb}{data[1],nvoXb}{data[2],nvoXb}{data[3],nvoXb}-{data[4],nvoXb}{data[5],nvoXb}-{data[6],nvoXb}{data[7],nvoXb}-{data[8],nvoXb}{data[9],nvoXb}-{data[10],nvoXb}{data[11],nvoXb}{data[12],nvoXb}{data[13],nvoXb}{data[14],nvoXb}{data[15],nvoXb}}}</DisplayString>
  </Type>
</AutoVisualizer>

Então CMakeLists.txtadicionei o sinalizador /NATVIS:

cmake_minimum_required (VERSION ${PROJECT_CMAKE_VERSION})

project (mylib)

add_definitions (-DBOOST_UUID_FORCE_AUTO_LINK)
add_definitions (-DMYLIB_EXPORTS)


find_package (Boost CONFIG REQUIRED QUIET)

set (PROJECT_SRC
  UUID.cpp
  Exception.cpp
  )

add_library (${PROJECT_NAME} SHARED ${PROJECT_SRC})
target_link_libraries(${PROJECT_NAME} PRIVATE ${Boost_LIBRARIES})
target_compile_features (${PROJECT_NAME} PUBLIC ${PROJECT_CXX_STANDARD})
target_include_directories (${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../)
target_include_directories (${PROJECT_NAME} PUBLIC ${Boost_INCLUDE_DIRS})

if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  get_filename_component(NATVIS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../resources/natvis/mulib.natvis" ABSOLUTE)
  message (STATUS "MyLib natvis file is ${NATVIS_DIR}")
  target_link_options(${PROJECT_NAME} PRIVATE  /NATVIS:${NATVIS_DIR})
endif()

O CMake está configurado e a mensagem aparece. Mas quando depuro a biblioteca, o .natvis parece não funcionar, vejo os dados simples de boost::uuids::uuid.

Como posso corrigir isso e mostrar a string UUID na janela do depurador?

c++
  • 1 respostas
  • 55 Views
Martin Hope
mraabhijit
Asked: 2025-04-08 16:22:17 +0800 CST

Itens sendo descartados ao adicionar uma lista à fila

  • 5

Tenho um sistema no qual estou tentando atingir um único ponto de ação para gravar em um banco de dados. Para isso, estou usando [nome Queuesdo sistema], busco um registro de [nome do sistema] queuee adiciono a [nome do sistema] list. Assim que tenho o número necessário de registros em [nome do sistema list], envio o item para [nome do sistema writer_queue], que é consumido por [nome do sistema] diferente threadpara gravar os registros no banco de dados ( SQLiteneste caso).

No entanto, quando adiciono o listao writer_queue, parece que nem todos os registros dentro do listsão adicionados, o que está causando lacunas indesejadas na tabela final. Não sei bem qual é a causa disso.

Abaixo está o código com o qual estou lidando:

import os
import time
import sqlite3

from queue import Queue
from pydantic import BaseModel
from typing import List, Dict, Optional
from threading import Thread
from dataclasses import dataclass

class Tables(BaseModel):
    max_buffer_length: int = 1000
    rt_table_name: str = ''
    query_schemas: Dict = {
        'RawTable': ['Time', 'Position', 'RPM', 'Flow', 
                              'Density', 'Pressure', 'Tension', 'Torque', 'Weight',],
    }
    table_schemas: Dict = {
        'RawTable': ['time', 'position', 'rpm', 'flow', 
                              'density', 'pressure', 'tension', 'torque', 'weight',],
    }

    def insert_data(self,
                    buffer: Optional[Queue] = None,
                    db_path: Optional[str] = None,
                    writer_queue: Optional[Queue] = None):

        conn = sqlite3.connect(db_path)
        
        table_name = self.rt_table_name

        cursor = conn.cursor()

        try:                    
            if buffer:
                self.insert_batch_data(conn, cursor, buffer, table_name, writer_queue)

        except sqlite3.Error as e:
            print(f"An error occurred: {e}")
            conn.rollback()
        finally:
            conn.commit()
            cursor.close()
            conn.close()

    def insert_batch_data(self, 
                          buffer: Queue,
                          table_name: str, 
                          writer_queue: Queue):
        # Insert data
        query = self.get_query(table_name)
        batch = []
        while True:
            if buffer.empty():
                time.sleep(5)
                continue

            item = buffer.get()
            if item is None:
                print("Reached Sentinal Value... Exiting thread...")
                break
            
            batch.append(item)
            if len(batch) == self.max_buffer_length:
                self.add_to_writer_queue(query, table_name, batch, writer_queue)
                print(f"Number of items added to writer_queue: {len(batch)}")
                batch.clear()

        # Insert any remaining records in the batch
        if batch:
            self.add_to_writer_queue(query, table_name, batch, writer_queue)

    def get_query(self, table_name: str) -> str:
        if not table_name:
            raise ValueError("Table name must not be empty")
        columns = self.query_schemas[table_name]
        placeholders = ', '.join(['?' for _ in columns])
        query = f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({placeholders})"
        return query

    def insert_records(self, cursor: sqlite3.Cursor, conn: sqlite3.Connection, query: str, batch: List, table_name: str):
        try:
            columns = self.table_schemas[table_name]
            data_tuples = [
                tuple(getattr(row, col) for col in columns)
                for row in batch
            ]
            cursor.executemany(query, data_tuples)
            conn.commit()
            print(f"Inserted {len(batch)} records into {table_name}")
        except sqlite3.Error as e:
            print(f"SQLite error occurred while inserting records into {table_name}: {e}")
            conn.rollback()
        except Exception as e:
            print(f"Unexpected error occurred while inserting records into {table_name}: {e}")
            conn.rollback()

    def process_db_writes(self,
                          writer_queue: Queue, 
                          db_path: str):
        try:
            conn = sqlite3.connect(db_path)
            cursor = conn.cursor()
                
            while True:
                while writer_queue.empty():
                    time.sleep(2)
                    # Sleep for 30 seconds
                    
                query, table_name, data = writer_queue.get()
                assert len(data) == self.max_buffer_length, f"Expected {self.max_buffer_length} items, received: {len(data)}\n"
                self.insert_records(cursor, conn, query, data, table_name)
        except Exception as e:
            print(f"Error encountered in process_db_writes: {str(e)}")
        finally:
            cursor.close()
            conn.close()

    def add_to_writer_queue(self, 
                            query: str, 
                            table_name: str, 
                            batch: List, 
                            writer_queue: Queue):
        while writer_queue.full():
            time.sleep(1)
        assert len(batch) == self.max_buffer_length, f"Expected {self.max_buffer_length} items, received: {len(batch)}\n"
        writer_queue.put((query, table_name, batch))

@dataclass
class RawData:
    time: float 
    position: float = 0.0
    rpm: float = 0.0
    flow: float = 0.0
    density: float = 0.0
    pressure: float = 0.0
    tension: float = 0.0
    torque: float = 0.0
    weight: float = 0.0

class Raw(Tables):
    def __init__(self, **data):
        super().__init__(**data)
        self.rt_table_name = 'RawTable'

    def populate_queue(buffer: Queue):
        for i in range(1_000_000):
            while buffer.full():
                time.sleep(1)
            buffer.put(RawData(time=i))
    
def fetch_raw_data(db_path: str, rt_db_path: str, db_writer: Queue, max_buffer_length: int, ):
    try:
        conn = sqlite3.connect(db_path)

        buffer = Queue(maxsize=max_buffer_length)

        raw = Raw(max_buffer_length=max_buffer_length)
        # Starting other threads
        fetcher = Thread(target=raw.populate_queue, args=(buffer))
        writer = Thread(target=raw.insert_data, args=(buffer, rt_db_path, db_writer))

        # Start the Threads
        fetcher.start()
        writer.start()

        # Join the threads
        fetcher.join()
        writer.join()
    except KeyboardInterrupt:
        print("Finishing threads due to keyboard interruption.")
        fetcher.join()
        writer.join()
    except Exception as e:
        print("Error encountered: ", e)
    finally:
        if conn:
            conn.close()

def get_rt_db_path(db_path: str, db_extension: str = '.RT'):
        db_dir, db_file = os.path.split(db_path)
        db_name, _ = os.path.splitext(db_file)

        if db_name.endswith('_Raw'):
            db_name = db_name[:-4]
        rt_db_name = db_name + '_' + db_extension
        return os.path.join(db_dir, rt_db_name)

def main():
    db_path = input("Enter absolute path of raw.db file: ")

    try:
        maxsize=1000
        db_writer = Queue(maxsize=maxsize)
        tables = Tables(max_buffer_length=maxsize)

        rt_db_path = get_rt_db_path(db_path)

        db_writer_thread = Thread(target=tables.process_db_writes, args=(db_writer, rt_db_path))
        # Start the db_writer_thread
        db_writer_thread.start()
        fetch_raw_data(db_path, rt_db_path, maxsize, db_writer)

        db_writer_thread.join()
    except KeyboardInterrupt:
        db_writer_thread.join()
    except Exception:
        db_writer_thread.join()

O problema parece ocorrer entre Tables.insert_batch_data()e Tables.add_to_writer_queue(). Na maioria das vezes, o comprimento real de Listpassado para add_to_writer_queue()não é igual ao len(batch)recebido na add_to_writer_queue()função. Não consegui descobrir se há um limite para o total de dados passados ​​para um queueobjeto na documentação. Por isso, fiquei muito confuso sobre por que os dados estão se perdendo e como garantir que todos os dados cheguem do Ponto A ao Ponto B.

python
  • 1 respostas
  • 48 Views
Martin Hope
Andrei Herford
Asked: 2025-04-08 15:45:44 +0800 CST

Como aplicar o plano de fundo do Content ViewController ao SafeArea inferior no UINavigationController?

  • 5

Ao portar meu aplicativo existente baseado em UIKit para SwiftUI, tenho dificuldade com uma tarefa simples:

A UIViewControllerRepresentablesegura um UINavigationController.

Os UINavigationControllerVCs são exibidos com cores de fundo diferentes. Essas cores não são aplicadas à área segura inferior. Como posso alterar isso para que a área segura tenha a cor do VC filho ativo?

insira a descrição da imagem aqui

struct SomeSheetContent: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> UIViewController {
        let firstVC = UIViewController()
        firstVC.view.backgroundColor = .green
        firstVC.title = "First VC"
        firstVC.edgesForExtendedLayout = [.all]
        firstVC.extendedLayoutIncludesOpaqueBars = true

        let button = UIButton(type: .system)
        button.setTitle("Next", for: .normal)
        button.titleLabel?.font = .systemFont(ofSize: 20, weight: .bold)
        button.addTarget(context.coordinator, action: #selector(Coordinator.didTapButton), for: .touchUpInside)

        firstVC.view.addSubview(button)
        button.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            button.centerXAnchor.constraint(equalTo: firstVC.view.centerXAnchor),
            button.centerYAnchor.constraint(equalTo: firstVC.view.centerYAnchor)
        ])
        

        let navVC = UINavigationController(rootViewController: firstVC)
        navVC.navigationBar.isTranslucent = false
        navVC.edgesForExtendedLayout = [.all]
        
        context.coordinator.navigationController = navVC
        
        return navVC
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) { }

    class Coordinator: NSObject {
        let parent: SomeSheetContent
        weak var navigationController: UINavigationController?

        init(_ parent: SomeSheetContent) {
            self.parent = parent
        }

        @objc func didTapButton() {
            let secondVC = UIViewController()
            secondVC.view.backgroundColor = .orange
            secondVC.title = "Second VC"
            secondVC.edgesForExtendedLayout = [.all]
            secondVC.extendedLayoutIncludesOpaqueBars = true

            navigationController?.pushViewController(secondVC, animated: true)
        }
    }
}
  • 1 respostas
  • 31 Views
Martin Hope
samuel merk
Asked: 2025-04-08 15:29:36 +0800 CST

`exams2forms()` em quarto reveal.js

  • 6

Adoro envolver os alunos na prática de recuperação ativa usando os pacotes {exams}e {exams2forms}. Incorporar webquizzes em HTML do quarto funciona perfeitamente usando eg

---
format: 
  html:
    embed-resources: true
    css: webex.css
    include-after-body: webex.js
---

# Task
```{r}
#| label: quiz2
#| echo: false
#| message: false
#| results: "asis"
#| warning: false

library("exams2forms")
exm <- list(c("swisscapital.Rmd"))
exams2forms(exm, n = 3)
```

com os arquivos webex.css e webex.js fornecidos aqui . No entanto, se eu alterar o formato de "reveals.js" html:para revealjs:"reveals.js", parece interferir no webex.js e não sei como evitar isso.

r-exams
  • 1 respostas
  • 21 Views
Martin Hope
abdollah
Asked: 2025-04-08 15:27:47 +0800 CST

Flutter define tema de uma lista

  • 5

Estou tentando adicionar uma lista de temas que o usuário pode escolher, aqui está minha lista

import 'package:flutter/material.dart';

class ThemeModel {
  final Color surface;
  final Color primary;
  final Color secondary;
  final Color onSurface;

  ThemeModel({
    required this.surface,
    required this.primary,
    required this.secondary,
    required this.onSurface,
  });
}

final List<ThemeModel> themes = [
  ThemeModel(
    surface: Color(0xFFF0EAD6),
    primary: Color(0xFF6C9A8B),
    secondary: Color(0xFFA67C52),
    onSurface: Color(0xFF3B3A36),
  ),
  ThemeModel(
    surface: Color(0xFFF5F5F5),
    primary: Color(0xFF6D6875),
    secondary: Color(0xFFFFB4A2),
    onSurface: Color(0xFF2D2D2D),
  ),
  ThemeModel(
    surface: Color(0xFFF0F8FF),
    primary: Color(0xFFA2C7E5),
    secondary: Color(0xFF89B0AE),
    onSurface: Color(0xFF2F3E46),
  ),
];

Vou mostrar uma lista e eles podem escolher uma que salvará um número como chosenTheme agora eu tenho um ThemeData como este

ThemeData myTheme = ThemeData(
  fontFamily: 'estedad',
  useMaterial3: true,
  //brightness: chosenTheme <= 2 ? Brightness.light : Brightness.dark,
  colorScheme:
      chosenTheme <= 2
          ? ColorScheme.light(
            surface: cards[chosenTheme].themes.surface,
            primary: cards[chosenTheme].themes.primary,
            secondary: cards[chosenTheme].themes.secondary,
            onSurface: cards[chosenTheme].themes.onSurface,
          )
          : ColorScheme.dark(
            surface: cards[chosenTheme].themes.surface,
            primary: cards[chosenTheme].themes.primary,
            secondary: cards[chosenTheme].themes.secondary,
            onSurface: cards[chosenTheme].themes.onSurface,
          ),
);

como posso definir isso como tema padrão de aplicativos em um provedor de temas?

flutter
  • 1 respostas
  • 26 Views
Martin Hope
Lee
Asked: 2025-04-08 15:14:44 +0800 CST

Meta-análise multivariada mixmeta vs metafor

  • 4

Gostaria de reproduzir uma meta-análise multivariada de mixmeta (Gasparrini et al., 2012) usando metafor (reconheço que houve uma pergunta semelhante antes, com resultados diferentes, em uma meta-análise multinível com dois pacotes semelhantes em R (metafor e mixmeta), que, no entanto, não foi respondida, pois nenhum exemplo reproduzível foi fornecido). Especificamente, espero reproduzir o modelo de meta-análise produzido por mixmeta() usando rma.mv().

Análises univariadas desses dois pacotes (mixmeta::mixmeta() e metafor::rma.uni()) podem ser facilmente comparadas. No entanto, os modelos multivariados produzidos por esses dois pacotes apresentaram diversas discrepâncias. Usando o conjunto de dados mixmeta::berkey98 como exemplo (veja o exemplo reproduzível abaixo), embora mixmeta() e rma.mv() tenham especificado REML como método de estimativa e CS (simetria composta) como estrutura de correlação (os resultados PD e AL do mesmo estudo são correlacionados), os modelos resultantes apresentam diferentes estimativas de efeito fixo, logLik dos modelos, etc. Embora as diferenças sejam muito pequenas (principalmente na segunda casa decimal), isso ajuda a entender por que essas discrepâncias ocorrem.

library(mixmeta)
#> This is mixmeta 1.2.0. For an overview type: help('mixmeta-package').
library(metafor)
#> Loading required package: Matrix
#> 
#> Loading the 'metafor' package (version 3.0-2). For an
#> introduction to the package please type: help(metafor)
#> 
#> Attaching package: 'metafor'
#> The following object is masked from 'package:mixmeta':
#> 
#>     blup
library(data.table)
# Multivariate
summary(mixmeta(cbind(PD,AL), S=berkey98[5:7], data=berkey98, bscov='cs'))  ### , method='reml' is default, cov str = unstr default
#> Call:  mixmeta(formula = cbind(PD, AL), S = berkey98[5:7], data = berkey98, 
#>     bscov = "cs")
#> 
#> Multivariate random-effects meta-analysis
#> Dimension: 2
#> Estimation method: REML
#> 
#> Fixed-effects coefficients
#>     Estimate  Std. Error        z  Pr(>|z|)  95%ci.lb  95%ci.ub     
#> PD    0.3636      0.0788   4.6163    0.0000    0.2092    0.5180  ***
#> AL   -0.3380      0.0782  -4.3229    0.0000   -0.4912   -0.1847  ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 
#> 
#> Random-effects (co)variance components
#>  Structure: Compound symmetry
#>     Std. Dev   Corr
#> PD    0.1582     PD
#> AL    0.1582  0.529
#> 
#> Multivariate Cochran Q-test for heterogeneity:
#> Q = 128.2267 (df = 8), p-value = 0.0000
#> I-square statistic = 93.8%
#> 
#> 5 units, 2 outcomes, 10 observations, 2 fixed and 2 random-effects parameters
#> logLik     AIC     BIC  
#> 3.3106  1.3789  1.6966

#prep data for metafor
yi=data.table(cbind(PD=berkey98$PD, AL=berkey98$AL, STUDY=rownames(berkey98), pubyear=berkey98$pubyear))
yi_long=melt(yi, id.vars = 'STUDY', measure.vars = c('PD', 'AL'), 
             value.name = c('Estimate'), variable.name = 'Measures')
v_list=list()
for (i in 1:nrow(berkey98)){
  V <- matrix(0, nrow=2, ncol=2)
  V=matrix(c(berkey98$var_PD[i],   berkey98$cov_PD_AL[i], berkey98$cov_PD_AL[i], berkey98$var_AL[i]), ncol=2 ); V
  v_list[[i]]=V
}
summary(rma.mv(yi=as.numeric(yi_long$Estimate), V=bldiag(v_list),  mods = ~ 0+Measures, struct = 'CS',  
               data=yi_long, random=~Measures | STUDY )) ###   ###
#> 
#> Multivariate Meta-Analysis Model (k = 10; method: REML)
#> 
#>   logLik  Deviance       AIC       BIC      AICc 
#>   3.0997   -6.1994    1.8006    2.1184   15.1340   
#> 
#> Variance Components:
#> 
#> outer factor: STUDY    (nlvls = 5)
#> inner factor: Measures (nlvls = 2)
#> 
#>             estim    sqrt  fixed 
#> tau^2      0.0273  0.1651     no 
#> rho        0.5447             no 
#> 
#> Test for Residual Heterogeneity:
#> QE(df = 8) = 142.8194, p-val < .0001
#> 
#> Test of Moderators (coefficients 1:2):
#> QM(df = 2) = 64.3617, p-val < .0001
#> 
#> Model Results:
#> 
#>             estimate      se     zval    pval    ci.lb    ci.ub 
#> MeasuresPD    0.3786  0.0813   4.6558  <.0001   0.2192   0.5379  *** 
#> MeasuresAL   -0.3361  0.0848  -3.9630  <.0001  -0.5023  -0.1699  *** 
#> 
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Criado em 2025-04-08 pelo pacote reprex (v2.0.1)

Eu apreciaria qualquer conselho sábio sobre o porquê disso acontecer e como produzir modelos mais próximos (se não idênticos) a partir desses dois pacotes.

Ref.: Gasparrini A, Armstrong B, Kenward MG (2012). Meta-análise multivariada para associações não lineares e outras associações multiparâmetros. Estatística em Medicina. 31(29):3821–3839.

  • 1 respostas
  • 35 Views
Martin Hope
ogura
Asked: 2025-04-08 15:08:28 +0800 CST

O servidor WebSocket TypeScript Fastify não está respondendo às mensagens do cliente

  • 5

Estou construindo um servidor WebSocket usando TypeScript, Node.js e Fastify. Quando me conecto a ele com um cliente, consigo estabelecer uma conexão, mas o servidor não responde a nenhuma mensagem que envio.

Configurar

Código do servidor (index.mts):

"use strict";

import fastify from "fastify";
import fastifyWebsocket from "@fastify/websocket";
import { FastifyRequest } from "fastify";

const fastifyServer = fastify();
fastifyServer.register(fastifyWebsocket);

fastifyServer.get(
  "/",
  { websocket: true },
  (connection: any, request: FastifyRequest) => {
    const { socket } = connection;
    socket.on("message", async (message: string) => {
      console.log("Received message:", message);
      socket.send("Hello from server");
    });
    socket.on("close", () => {
      console.log("WebSocket connection closed");
    });
  }
);

fastifyServer.listen({ host: "0.0.0.0", port: 3000 }, (err: Error | null) => {
  console.log("Server started on port 3000");
  if (err) {
    fastifyServer.log.error(err);
    process.exit(1);
  }
});

pacote.json:

{
  "name": "fastifywebsocket",
  "version": "1.0.0",
  "description": "",
  "main": "index.mjs",
  "scripts": {
    "build": "tsc -p tsconfig.json",
    "start": "node dist/index.mjs",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "Toshiyuki Ogura",
  "license": "ISC",
  "type": "module",
  "dependencies": {
    "@fastify/websocket": "^11.0.2",
    "fastify": "^5.2.2"
  },
  "devDependencies": {
    "@types/node": "^22.14.0",
    "typescript": "^5.8.3"
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "target": "es2016",
    "module": "ES6",
    "rootDir": "./src",
    "moduleResolution": "node",
    "typeRoots": ["./node_modules/@types"],
    "outDir": "./dist",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true
  }
}

Emitir

Eu construo e executo o servidor com:

npm run build
npm start

Então eu conecto de um cliente usando websocat :

websocat ws://localhost:3000/

A conexão parece ter sido estabelecida, mas quando envio uma mensagem do cliente (como "abc" + Enter), o servidor não exibe nenhum log e não responde. O servidor deveria:

  1. Registre "Mensagem recebida: abc" no console
  2. Enviar "Olá do servidor" de volta ao cliente

Mas nada acontece. Também não vejo nenhum erro.

O que eu tentei

  • O servidor inicia sem erros
  • O cliente se conecta sem erros
  • As mensagens do cliente para o servidor não parecem acionar o manipulador de eventos de mensagem

O que pode estar causando essa falta de resposta? Há algo errado com a configuração do meu WebSocket?

node.js
  • 1 respostas
  • 47 Views
Martin Hope
ZarakshR
Asked: 2025-04-08 13:38:27 +0800 CST

Não consigo entender por que o Alloy não encontra uma instância para meu modelo

  • 5

Estou tentando resolver o problema do aperto de mão de Halmos (Seção 2.3) usando Alloy 4 (sou obrigado a usar Alloy 4 no meu curso universitário; no entanto, esta folha de problemas não faz parte do meu trabalho de curso, estou tentando resolvê-la como prática).

Este é o modelo que eu criei:

module halmos

abstract sig Person { shook : set Person }
sig Man extends Person { wife : one Woman }
sig Woman extends Person { husband : one Man }
one sig Me in Man { }
one sig MyWife in Woman { }

fact {
    Me.wife = MyWife
    MyWife.husband = Me
}

// hand-shaking is symmetric
fact { all p : Person | p.shook = shook.p }

// "No one shook his or her own hand"
fact { all p : Person | p not in p.shook }

// "no husband shook his wife’s hand"
// this and symmetricity of shook implies no wife shook her husband's hand
fact { all m : Man | m.wife not in m.shook }

fact monogamy {
    all m : Man, w : Woman |
        // these parens are needed for correct precedence
        (m.wife = w implies w.husband = m)
        and
        (w.husband = m implies m.wife = w)
}

// all distinct persons (other than Me) shook a different number of hands
fact {
    all disj p1,p2 : Person - Me |
        #p1.shook != #p2.shook
}

O problema é que o Alloy não consegue encontrar uma instância para o caso com 10 Persons, embora eu saiba pela descrição do problema que deveria haver um modelo com 10 Persons que satisfaça minha especificação.

run { } for exactly 10 Personme dá:

Executing "Run run$1 for exactly 10 Person"
   Solver=glucose 4.1(jni) Bitwidth=4 MaxSeq=4 SkolemDepth=1 Symmetry=20
   5762 vars. 440 primary vars. 14101 clauses. 10ms.
   No instance found. Predicate may be inconsistent. 1094ms.

Curiosamente, run { } for exactly 8 Personme dá:

Executing "Run run$1 for exactly 8 Person"
   Solver=glucose 4.1(jni) Bitwidth=4 MaxSeq=4 SkolemDepth=1 Symmetry=20
   3645 vars. 288 primary vars. 8394 clauses. 6ms.
   Instance found. Predicate is consistent. 17ms.

e uma saída como esta, que parece corresponder à descrição de Halmos (nenhuma das duas pessoas -- exceto Mee -- MyWifetem o mesmo número de apertos de mão):

da mesma forma, run { } for exactly 4 Personme dá, como esperado:

Executing "Run run$1 for exactly 4 Person"
   Solver=glucose 4.1(jni) Bitwidth=4 MaxSeq=4 SkolemDepth=1 Symmetry=20
   980 vars. 80 primary vars. 1931 clauses. 2ms.
   Instance found. Predicate is consistent. 1ms.

e run { } for exactly 5 Personnão consegue encontrar uma instância (já que precisamos de um número par de pessoas para combiná-las como casais), como esperado.

Por que, então, o Alloy não consegue encontrar uma instância para 10 Persons? Estou usando o Alloy errado ou minha especificação está incorreta de alguma forma?

Obrigado,

alloy
  • 1 respostas
  • 19 Views
Martin Hope
Nikhil Shivanath
Asked: 2025-04-08 13:37:07 +0800 CST

O contexto não está sendo consumido no Next.js

  • 5

Estou tentando migrar meu projeto do React para o NextJS, e isso inclui o uso de contextos. Encapsulei os filhos no provedor de contexto no layout.tsxarquivo na rota que preciso (roteador de aplicativo). Mas quando tento consumir esse contexto em um dos componentes filhos, não funciona. Não está fazendo nada.

Já me certifiquei de que a criação do contexto, o componente filho e tudo mais são componentes do lado do cliente, mas ainda não funciona. Você poderia me ajudar com isso?

//consuming context
'use client'
import { useState } from "react"
import Image from "next/image"
import api from "../../../interceptors"
import { useRouter } from "next/navigation"
import create_simulation from "../../../public/create_simulation.svg"
import { useUserRoomContext } from "../../../lib/contexts/UserContext"

const CreateInterview = () => {
    const [loading,setLoading]=useState(false)
    const [error,setError]=useState("")
    const [interviewDetails , setInterviewDetails] = useState({
        company_name : "" , 
        job_description : "" , 
        role: "",
        resume: "",
    })
    

    const router = useRouter()
    const {setRoomId, setToken}=useUserRoomContext()
// context
"use client"
import {createContext, useState, useContext} from "react"

const userRoomContext = createContext()
export const useUserRoomContext = () => useContext(userRoomContext)

export const UserRoomProvider = ({children}) =>{

    const [roomId,setRoomId] = useState("")
    const [token,setToken]=useState(null)
    const [reportGenerated,setReportGenerated]=useState(false)

    const value={
        roomId,
        setRoomId,
        token,
        setToken,
        reportGenerated,
        setReportGenerated
    }

    return <userRoomContext.Provider value={value}>
        {children}
    </userRoomContext.Provider>
}

Aqui está o layout que usa o provedor de contexto para seus filhos:

"use client"
import React from 'react'
import { UserRoomProvider } from '@/lib/contexts/UserContext'
import ProtectedRoute from '@/components/protection/ProtectedRoute'

const InterviewLayout = ({children}: Readonly<{children: React.ReactNode}>) => {
    console.log("Interview layout rendered")
    return (

        <UserRoomProvider>
            <ProtectedRoute>{ children }</ProtectedRoute>
        </UserRoomProvider>
      )
    
}

export default InterviewLayout
reactjs
  • 1 respostas
  • 23 Views
Prev
Próximo

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve