Revisão da série prática MatrixOne | Prática de cenário de projeto de importação e exportação

Este compartilhamento apresenta principalmente a importação e exportação MatrixOne e a prática de cenário de projeto. Demonstraremos as funções do MatrixOne em quatro direções, ou seja, importação de dados, exportação, ferramentas de integração de dados de encaixe e prática de conexão Java.

A importação de dados usará três métodos para importar dados para o MatrixOne. Eles são instrução de inserção, instrução de carregamento de dados e método de origem. Observação especial é que carregar dados oferece suporte à extração e importação de arquivos do sistema de arquivos S3 remoto.

Para arquivos json, MatrixOne também fornece um método de importação. Vamos tentar fazer isso juntos mais tarde.

MatrixOne também fornece uma variedade de métodos para exportação de dados. Aqui usamos o método select into outfile e a ferramenta mo_dump para praticar a exportação de dados.

Como um banco de dados HSTAP, o MatrixOne também oferece suporte, até certo ponto, a algumas das ferramentas de integração de dados e mecanismos de cálculo mais populares do mercado. Este vídeo demonstrará como Datax, Flink e Spark integram MatrixOne.

Finalmente, um projeto SpringBoot simples é usado para usar MatrixOne como banco de dados de negócios para executar funções CRUD.

Acredito que através da prática dessas quatro partes, todos deverão ser capazes de compreender basicamente as poderosas funções do banco de dados MatrixOne.

A seguir começamos a entrar na primeira parte, importação de dados MatrixOne.

Parte 1 Importação de dados

#1 inserção no método

Aqui você precisa criar uma tabela de clientes no MatrixOne. A tabela de clientes consiste em quatro campos, que são chaves primárias de incremento automático. O nome do cliente, cidade e país são todos do tipo Varchar. Primeiro especificamos as colunas a serem importadas e, em seguida, usamos o método de inserção em lote para importar. Por fim, criamos uma tabela de backup da tabela do cliente e usamos o método insert into select para fazer backup dos dados da tabela do cliente na tabela de backup do cliente.

#2 método de carregamento de dados

▶ 2.1 Importar arquivo csv

Vamos praticar a função de carregamento de dados. Primeiro importe o arquivo customer.csv local que foi preparado antecipadamente.

Vamos dar uma olhada neste arquivo csv primeiro. Existem três linhas de dados de teste. A linha inicial são os dados. Não há necessidade de remover o cabeçalho. O separador de coluna é uma vírgula e o separador de linha é um caractere de nova linha.

Em seguida, execute o comando carregar dados para importar os dados. O que precisa ser observado é o caminho do arquivo. Se não tiver certeza, escreva o caminho absoluto.

Nota: Se o seu arquivo de dados estiver em uma máquina diferente do servidor MatrixOne, ou seja, quando o arquivo de dados estiver na máquina cliente que você está usando, então você precisa usar o comando Mysql Client para se conectar ao host de serviço MatrixOne e adicionar um parâmetro --local-infile. ;E a linha de comando importada precisa usar a sintaxe de carregamento de dados local infile.

Além disso, MatrixOne oferece suporte à importação em lote de arquivos csv e jsonline do serviço de armazenamento de objetos S3 usando o comando load data.

Fiz um teste aqui para importar um arquivo csv do sistema de arquivos Alibaba OSS para o MatrixOne. Por questões de tempo, não vou demonstrar. Vamos dar uma olhada na sintaxe e nos efeitos.

Primeiro, precisamos criar um bucket no OSS com antecedência e, em seguida, obter o Ak, o sk e a região necessários para autorização.

Nos dados de carregamento, configuramos o endpoint OSS, ak, sk, nome do bucket, região, formato de compactação e caminho do arquivo em sequência. Os outros métodos são iguais à importação local.

▶ 2.2 Importar arquivo json

Foi demonstrado que ao importar arquivos csv, vamos tentar importar arquivos json juntos.

Primeiro criamos uma nova tabela para receber os dados importados. Crie um arquivo json_line_obj.jl e adicione vários dados de teste json.

Em seguida, use o comando carregar dados para importar. Deve-se observar que todos os objetos neste arquivo json são objetos, estruturas não array. Os nomes e tipos de campo precisam corresponder aos tipos de nome de campo na tabela MatrixOne.

Em seguida, criamos uma nova tabela t2 para testar a importação do array json.

Aqui preparamos três arquivos com antecedência. O primeiro é um arquivo json.jl comum. O segundo é um pacote compactado bz2. Após a descompactação, você pode ver que é um arquivo jl. O terceiro é um arquivo compactado com o formato bz2. gz.

Executamos três comandos de importação em sequência, nos quais o campo jsondata é utilizado para identificar a estrutura json, a diferença do anterior é que ao invés de preencher um array, ele não é mais um objeto.

O segundo comando requer atenção para configurar o formato de compactação.

O terceiro comando ignora a primeira linha ao importá-lo. Vamos ver o efeito após executá-lo.

Você pode ver que não há primeira linha de dados durante a importação aqui.

#3 comando de origem

Finalmente, usamos o comando source para importar o arquivo sql preparado antecipadamente para o MatrixOne.

Se a quantidade de dados for relativamente grande, você pode usar nohup com o parâmetro Mysql client-e para realizar a importação em segundo plano.

A seguir, compartilharei com vocês a exportação de dados do MatrixOne.

Primeiro, use select into outfile.

Preparei uma tabela sys_permission com antecedência, que contém alguns dados de teste.

Usamos SQL para exportação.

Após a conclusão da exportação, você poderá ver o arquivo sys_permission.csv gerado correspondente no diretório atual.

Além disso, você também pode especificar o separador ao exportar SQL e, em seguida, exportá-lo uma vez usando uma barra vertical como separador de colunas.

Após a conclusão da exportação, você pode ver que no arquivo correspondente, os separadores de colunas foram alterados para linhas verticais.

 

Parte 2 Exportação de Dados

Ferramenta de despejo de movimento nº 1


A seguir, apresentarei a ferramenta mo-dump. É uma ferramenta de exportação do lado do cliente do MatrixOne. Assim como o mysqldump, pode ser usado para fazer backup do banco de dados MatrixOne exportando arquivos do tipo .sql. O arquivo sql exportado também contém instruções de criação de estrutura de tabela.

Esses parâmetros podem ser configurados:

  • -u especifica o nome de usuário para conectar-se ao servidor MatrixOne. Somente usuários com permissões de leitura de banco de dados e tabela podem usar mo-dump. O valor padrão é root.
  • -p especifica a senha do usuário MatrixOne. Valor padrão: 111.
  • -h especifica o endereço IP do host do servidor MatrixOne. Padrão: 127.0.0.1
  • -P especifica a porta do servidor MatrixOne. Valor padrão: 6001
  • -db especifica os parâmetros necessários. O nome do banco de dados do qual fazer backup.
  • -net-buffer-length especifica o tamanho do pacote, que é o tamanho total dos caracteres da instrução SQL. O pacote de dados é a unidade básica dos dados de exportação SQL. Se nenhum parâmetro for definido, o padrão é 1048576 Byte (1M) e a configuração máxima é 16777216 Byte (16M). Se o parâmetro aqui for definido como 16777216 bytes (16 M), quando dados maiores que 16 M forem exportados, os dados serão divididos em vários pacotes de dados de 16 M. Exceto o último pacote de dados, os outros tamanhos de pacote de dados são 16 M.
  • -tbl é um parâmetro opcional. Se o parâmetro estiver vazio, todo o banco de dados será exportado. Se desejar fazer backup de uma tabela especificada, você pode especificar vários -tbl e nomes de tabelas no comando.

A ferramenta mo-dump precisa baixar o código-fonte do git para compilação. Por motivos de tempo, não demonstrarei o processo de compilação aqui. Usarei diretamente o pacote binário que compilei antecipadamente para demonstração.

Exporte a tabela test_json_load que criamos anteriormente através do comando mo-dump.

Você pode ver que o resultado exportado é um arquivo .sql. Vamos verificar este arquivo sql.

Parte 3 ferramenta de integração de dados de encaixe 

Primeiro importamos dados do Mysql para o MatrixOne através do Datax. A versão do Mysql que usamos aqui é 8.0.32, e preparei a tabela do banco de dados de teste como dados de origem com antecedência.

MatrixOne é altamente compatível com MySQL 8.0. Como o MySQL Writer que vem com DataX é adaptado para o driver JDBC 5.1, a fim de melhorar a compatibilidade do programa, a comunidade transformou de forma independente o plug-in MatrixOne Writer baseado no driver 8.0.

Observe também esta frase : Em termos de implementação subjacente, MatrixOneWriter se conecta ao banco de dados MatrixOne remoto por meio de JDBC e executa a instrução insert into... sql correspondente para gravar dados em MatrixOne (eles serão enviados ao banco de dados em lotes internamente).

Não entrarei em detalhes sobre a implantação e introdução do Datax. Podemos primeiro dar uma olhada no arquivo de configuração do trabalho Datax, que precisamos escrever nós mesmos.

Todas as nossas informações de configuração estão no objeto job. O objeto de trabalho possui dois atributos, nomeadamente setting e content .

  • Alguns parâmetros da tarefa Datax podem ser configurados na configuração, por exemplo, a velocidade aqui representa a velocidade de importação, que é o paralelismo definido.
  • As informações da fonte de dados e da fonte de destino são configuradas no conteúdo. As informações da fonte de dados são configuradas no objeto leitor e a fonte de destino é configurada no gravador. As configurações específicas do leitor e do gravador serão analisadas com base nos arquivos que nós mesmos escrevemos ao importar mais tarde.

Preparei o Datax com antecedência e coloquei o MatrixOneWriter no diretório de plugins correspondente.

A seguir, vamos dar uma olhada no arquivo de trabalho que escrevemos, é comum colocar esse arquivo no diretório de trabalho do Datax.

Deixe-me primeiro dizer que nosso objetivo é ler dados do Mysql e gravá-los no MatrixOne, então o leitor aqui pode apenas usar o mysqlreader que vem com o Datax. O gravador usa o Matrixonewriter que importamos.

Observe que os nomes do leitor e do escritor aqui diferenciam estritamente maiúsculas de minúsculas.

Além de configurar o nome, você também precisa configurar a coluna da linha importada, conexão de informações de conexão Mysql, nome de usuário e senha nos parâmetros.

Da mesma forma, além de configurar o nome, o escritor também precisa configurar a coluna, as informações de conexão do MatrixOne, o nome de usuário e a senha nos parâmetros.

Além disso, o Datax pode fornecer campos pré-Sql para implementar ETL na exportação. ETL para este lugar

SQL será executado antes da importação.

Após a gravação do arquivo de configuração, execute o comando Datax para especificar o arquivo de tarefa. Preste atenção ao caminho do arquivo do trabalho aqui.

Após a execução bem-sucedida, você pode ver que os dados foram gravados no MatrixOne.

Parte 4 Prática de conexão Java 

A seguir, mostrarei como importar dados do Mysql e Kafka para o MatrixOne por meio do mecanismo Flink.

Apache Flink é um mecanismo de processamento distribuído para computação com estado em fluxos de dados ilimitados e limitados. O Flink é executado em todos os ambientes de cluster comuns e pode computar em velocidades de memória e em qualquer escala.

Não vou introduzir muito o conceito de Flink, vamos começar a praticá-lo diretamente.

Mais uma coisa a dizer aqui é que a versão do MatrixOne usada neste vídeo compartilhado é 1.0.0 RC2.

#1 MySQL

Primeiro usamos o Mysql como fonte de dados e importamos os dados do Mysql para o MatrixOne por meio do Flink JDBC. Você pode ver que a versão do Mysql que estou usando aqui é 8.0.32.

A seguir, criamos tabelas de fontes de dados no Mysql e adicionamos alguns dados. Em seguida, crie uma tabela de destino no MatrixOne para receber os dados exportados do Mysql.

Crie um banco de dados de teste no Mysql e crie uma tabela pessoal neste banco de dados. Adicione 3 dados por meio do método de inserção para demonstração.

Da mesma forma, crie uma biblioteca mais importante no MatrixOne e crie uma tabela pessoal correspondente ao Mysql nesta biblioteca. Preste atenção para manter o tipo de dados consistente, caso contrário ocorrerão problemas.

Então, você precisa criar um projeto Flink localmente. Primeiro precisamos criar um projeto Maven e configurar as dependências relevantes que precisamos usar. Eu também criei este projeto com antecedência.

Dê uma olhada no arquivo pom primeiro. Deve-se observar que a versão do Flink usada aqui é 1.17.0 e a versão do JDK é 1.8. Você também precisa introduzir flink-connector-jdbc e mysql-connector-java. O driver Mysql versão e a versão do Mysql precisam ser introduzidas.

Você também precisa escrever uma classe de entidade Person para mapear os dados correspondentes no banco de dados.

Depois que o trabalho anterior estiver pronto, podemos escrever o programa principal do Flink.

Crie uma classe chamada Mysql2Mo e escreva o programa Flink na função principal.

Para resumir, existem várias etapas necessárias para escrever um programa Flink:

  1. Obtenha o ambiente de execução.
  2. Defina o grau de paralelismo. Aqui defino 1 para indicar o uso de um thread para execução.
  3. Em seguida, defina o tipo e o nome do campo de consulta.
  4. Adicionando Fonte é a fonte de dados. O que está configurado aqui são as informações de conexão do Mysql. Os dados podem ser encontrados através do SQL configurado na consulta.
  5. Após obter a fonte de dados, você pode fazer ETL através do programa Flink. Aqui está um exemplo simples para encapsular os resultados obtidos em objetos Person.
  6. Configure o Sink, que é o endereço onde os dados são finalmente gravados, que é o nosso MatrixOne aqui, e configure os parâmetros relevantes.
  7. Execute o programa Flink.

Após o sucesso da execução, vamos ao MatrixOne e vemos que os dados previamente adicionados ao Mysql foram importados.

 

#2 Kafka

Em seguida, usamos Kafka como fonte de dados e sincronizamos os dados de Kafka para MatrixOne.

Instalei o Kafka localmente e a versão do Kafka usada é 3.0.0.

Continuamos a usar a tabela person criada por MatrixOne antes. Para ver o efeito mais claramente, usamos o comando truncate para limpar primeiro os dados de teste anteriores.

Em seguida, use um script de linha de comando Kafka para criar um tópico. O nome do tema é Matrixone.

Em seguida, precisamos escrever um programa Flink. As etapas principais são as mesmas de antes.

Observamos principalmente a Fonte e o Sumidouro mais críticos.

A fonte é configurada aqui com informações de conexão do Kafka, incluindo grupos de consumidores e estratégias de consumo, e então um serializador customizado é configurado para converter a string em um objeto Person.

Aqui você pode imprimir os dados de origem obtidos.

Sink configura as informações de conexão do MatrixOne aqui, usando o conector JDBC.

Então iniciamos o projeto, e o programa Flink irá bloquear aqui, esperando que produzamos dados no Kafka.

Usamos a ferramenta de linha de comando para simular um produtor Kafka e gravar três dados no Kafka.

Em seguida, observe que MatrixOne também sincronizará esses três dados.

Depois de demonstrar o mecanismo Flink adequado para processamento de fluxo, deixe-me demonstrar como o mecanismo de processamento em lote Spark se integra ao MatrixOne e grava dados Mysql no MatrixOne por meio do Spark.

A versão do MatrixOne usada aqui é a versão 1.0.0 RC2. É uma versão autônoma construída por meio da ferramenta mo_ctl.

Primeiro usamos o Mysql como fonte de dados e importamos os dados do Mysql para o MatrixOne por meio do Flink JDBC. Você pode ver que a versão do Mysql que estou usando aqui é 8.0.32.

A seguir, criamos tabelas de fontes de dados no Mysql e adicionamos alguns dados. Em seguida, crie uma tabela de destino no MatrixOne para receber os dados exportados do Mysql.

Crie um banco de dados de teste no Mysql e crie uma tabela pessoal neste banco de dados. Adicione 3 dados por meio do método de inserção para demonstração.

Da mesma forma, crie uma biblioteca mais importante no MatrixOne e crie uma tabela pessoal correspondente ao Mysql nesta biblioteca. Preste atenção para manter o tipo de dados consistente, caso contrário ocorrerão problemas.

Então, você precisa criar um projeto Spark localmente. Primeiro precisamos criar um projeto Maven e configurar as dependências relevantes que precisamos usar. Eu também criei este projeto com antecedência.

Dê uma olhada no arquivo pom primeiro. Deve-se observar que a versão do Spark usada aqui é 3.2.1 e a versão do JDK é 1.8. Preste atenção extra ao fato de que a versão do driver Mysql precisa ser compatível com MySQL.

Você também precisa escrever uma classe de entidade Person para mapear os dados correspondentes no banco de dados.

Quando o trabalho anterior estiver pronto, podemos escrever o programa principal do Spark.

Crie uma classe chamada Mysql2Mo e escreva um programa Spark na função principal.

Aqui está um resumo das etapas necessárias para escrever um programa Spark:

  1. Obtenha o objeto Session e o objeto de contexto Spark por meio da Session.
  2. Defina as informações de conexão do MySQL, incluindo nome de usuário, senha e classe de driver.
  3. Use o objeto de contexto para configurar a URL de conexão MySQL para leitura de dados.
  4. 4. Encapsule os resultados da leitura em um objeto DataSet.
  5. O ETL é realizado através do método DataSet Stream, onde os dados com ID maior que 2 são filtrados.
  6. Configure as informações de conexão do MatrixOne e grave dados no banco de dados de destino.

Após o sucesso da execução, vamos ao MatrixOne e vemos que os dados previamente adicionados ao Mysql foram importados.


#3 SpringBoot

Na última parte, usaremos um projeto SpringBoot para usar MatrixOne como banco de dados de negócios para executar funções CRUD.

Primeiro crie uma tabela de usuário no MatrixOne e adicione novos dados.

Em seguida, crie um projeto Springboot e Mybatis-plus localmente.

Aqui você precisa configurar o pacote jar usado através do Maven.

Em seguida, configure a fonte de dados no arquivo de configuração Springboot. A configuração aqui é consistente com a configuração do Mysql.

Em seguida, compile um mapeador e herde a interface raiz Myabtis-plus BaseMapper, para que você possa usar as funções básicas integradas de adição, exclusão, modificação e consulta sem escrevê-las você mesmo.

Não escrevi a camada de serviço aqui, por conveniência chamei o mapeador diretamente na camada do controlador.

Finalmente, escreva a camada do controlador para fornecer quatro interfaces externas, ou seja, consultar a interface da lista de usuários, adicionar a interface do usuário, modificar a interface do usuário e excluir a interface do usuário.

Em seguida iniciamos o projeto e acessamos diretamente através da ferramenta de testes Http.

Isso encerra o compartilhamento, obrigado a todos por assistirem.

 

Sessão de perguntas e respostas

Obrigado a todos por se juntarem a mim no aprendizado do conhecimento relevante sobre importação e exportação de práticas de cenários de projetos. Vamos passar para a sessão de perguntas e respostas.

P: Quero usar a ferramenta mo-dump para exportar apenas a estrutura da tabela, mas não os dados. Como posso exportá-la?

R: Você pode seguir o comando de exportação com o parâmetro -no-data para especificar a não exportação de dados.

P: Alguns campos estão faltando no objeto JSON importado usando dados de carregamento. A importação reportará um erro?

R: A importação reportará um erro. Os campos no json importado excedem os campos da tabela. Ele pode ser importado normalmente, mas os campos extras serão ignorados. Se houver menos campos, a importação não poderá ser feita.

P: Posso escrever um caminho relativo para o arquivo importado ao executar a importação de origem?

R: Você pode escrever um caminho relativo, que é relativo ao caminho atual que você usa no cliente MySQL. Recomenda-se escrever o caminho completo aqui para evitar erros e prestar atenção aos problemas de permissão de arquivo.

P: É demorado usar o comando carregar dados para importar um arquivo grande. Às vezes, ele será interrompido e será necessário recomeçar. Ele pode ser otimizado?

R: Você pode especificar PARALLEL como verdadeiro ao importar para ativar a importação paralela. Por exemplo, para um arquivo grande de 2G, use dois threads para carregar. O segundo thread primeiro divide e localiza a posição de 1G e depois continua de volta. Leia e carregar. Dessa forma, dois threads podem ler arquivos grandes ao mesmo tempo, e cada thread pode ler 1G de dados. Você também pode dividir os arquivos de dados.

P: Há alguma transação ao importar dados de carga?

R: Todas as instruções de carregamento são transacionais.

P: Os gatilhos e procedimentos armazenados envolvidos nas importações de origem SQL serão executados e entrarão em vigor?

R: Atualmente, se houver tipos de dados, gatilhos, funções ou procedimentos armazenados incompatíveis no SQL, você ainda precisará modificá-los manualmente, caso contrário, um erro será relatado durante a execução.

P: O mo-dump oferece suporte à exportação em lote de vários bancos de dados?

R: Suporta apenas a exportação do backup de um único banco de dados. Se você tiver vários bancos de dados para fazer backup, será necessário executar manualmente o mo-dump várias vezes.

P: MatrixOne oferece suporte à importação de dados do Minio?

R: Sim, o comando load data oferece suporte à importação de dados de arquivos locais, serviços de armazenamento de objetos S3 e serviços de armazenamento de objetos compatíveis com S3 para o Matrixone.

Minio também é baseado no protocolo S3, portanto também é compatível. Para documentos de referência específicos : https://docs.matrixorigin.cn/1.0.0/MatrixOne/Deploy/import-data-from-minio-to-mo/

P: Quando o MatrixOne importa e exporta dados, se ocorrer um problema de codificação, resultando em dados distorcidos, como geralmente o resolvemos?

R: Como o Matrixone suporta apenas a codificação UTF8 por padrão e não pode ser alterado; portanto, se caracteres ilegíveis aparecerem durante a importação de dados, não podemos resolvê-lo modificando o conjunto de caracteres do banco de dados e da tabela. Podemos tentar converter a codificação dos dados para UTF8. Ferramentas de conversão comuns incluem iconv e recode, por exemplo: converter dados codificados em GBK para codificação UTF-8: iconv -f GBK -t UTF8 t1.sql > t1_utf8.sql.

P: Quais permissões são necessárias ao importar e exportar MatrixOne?

R: Como administrador de locatários, você pode executar operações de importação e exportação diretamente por meio da função padrão. Para usuários comuns, ao importar, eles precisam da permissão 'insert' da tabela importada; ao exportar no modo select...into outfile, eles precisam da permissão 'select' da tabela de exportação; ao exportar com mo-dump, todos tabelas (tabela *.*) são necessárias. Permissão 'select' e permissão 'mostrar tabelas' para todas as bibliotecas (banco de dados *.*).


Sobre MatrixOne
MatrixOne é um banco de dados multimodo baseado em tecnologia nativa de nuvem que pode ser implantado em nuvens públicas e privadas. Este produto usa uma arquitetura técnica original que separa armazenamento e computação, separação de leitura e gravação e separação de quente e frio. Ele pode suportar simultaneamente várias cargas, como transação, análise, fluxo, temporização e vetor em um conjunto de armazenamento e sistemas de computação e pode executar armazenamento e recursos de computação isolados ou compartilhados em tempo real e sob demanda. O banco de dados nativo da nuvem MatrixOne pode ajudar os usuários a simplificar significativamente a arquitetura de TI cada vez mais complexa e fornecer serviços de dados minimalistas, extremamente flexíveis, econômicos e de alto desempenho.

Desde o seu lançamento, o MatrixOne Enterprise Edition e o MatrixOne Cloud Services foram aplicados em muitos setores, como Internet, finanças, energia, manufatura, educação e assistência médica. Graças ao seu design arquitetônico exclusivo, os usuários podem reduzir os custos de hardware e operação e manutenção em até 70%, aumentar a eficiência do desenvolvimento em 3 a 5 vezes e, ao mesmo tempo, responder com mais flexibilidade às mudanças na demanda do mercado e aproveitar as oportunidades de inovação de forma mais eficiente. . Ao investir no mesmo hardware, a MatrixOne pode obter várias vezes mais melhorias de desempenho.
MatrixOne adere ao conceito de código aberto e co-construção ecológica. Todos os códigos principais são de código aberto e totalmente compatíveis com o protocolo MySQL. MatrixOne criou várias soluções ponta a ponta com parceiros, reduzindo significativamente os custos de migração e uso dos usuários, e ajudar os usuários a evitar problemas de fornecimento.Risco de dependência do fornecedor.

Site oficial da MatrixOrigin: uma nova geração de banco de dados de código aberto heterogêneo hiperconvergente - Matrix Origin (Shenzhen) Information Technology Co., Ltd. MatrixOne
Github warehouse: GitHub - Matrixorigin/matrixone: banco de dados nativo hiperconvergente de borda de nuvem
Palavras -chave : banco de dados hiperconvergente , banco de dados multimodo, banco de dados nativo da nuvem, banco de dados doméstico

Bilibili caiu duas vezes, o acidente de primeiro nível “3.29” da Tencent... Fazendo um balanço dos dez principais acidentes de inatividade em 2023 Vue 3.4 “Slam Dunk” lançou MySQL 5.7, Moqu, Li Tiaotiao… Fazendo um balanço da “parada” em 2023 Mais ”Projetos e sites (código aberto) relembram o IDE de 30 anos atrás: apenas TUI, cor de fundo brilhante... Vim 9.1 é lançado, dedicado a Bram Moolenaar, o pai do Redis, "Rapid Review" LLM Programming: Omniscient e Onipotente&& Estúpido "Pós-código aberto "A era chegou: a licença expirou e não pode atender ao público em geral. A China Unicom Broadband repentinamente limitou a velocidade de upload e um grande número de usuários reclamaram. Os executivos do Windows prometeram melhorias: Faça o começo Menu ótimo novamente. Niklaus Wirth, o pai de Pascal, faleceu.
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/u/5472636/blog/10149502
Recomendado
Clasificación