Author: r5koq724ythz

  • ozymandias

    Ozymandias

    Causes text to decay by converting a text file to an image, then OCRing the image back to a text file. Only text files are saved.

    Setup for OSX:

    brew install tesseract
    brew install imagemagick

    To use, just run

    ./the_decay_of_that_colossal_wreck.sh

    Options:

    -i: Specify the number of iteration; the default is 10.

    -f: Take a text file as input

    -t: Take a string as input

    If no input text is specified, the poem Ozymandias by Percy Shelley is used.

    Example commands:

    # Convert the text of Ozymandias 100 times
    ./the_decay_of_that_colossal_wreck -i 100
    
    # Use a file as input
    ./the_decay_of_that_colossal_wreck -f path/to/filename.txt
    
    # A string as input, iterating 5 times
    ./the_decay_of_that_colossal_wreck -t "Mouse Reeve" -i 5

    Example output:

    The original poem:

    Ozymandias, by Percy Shelley
    
    I met a traveller from an antique land
    Who said: Two vast and trunkless legs of stone
    Stand in the desert... near them, on the sand,
    Half sunk, a shattered visage lies, whose frown,
    And wrinkled lip, and sneer of cold command,
    Tell that its sculptor well those passions read
    Which yet survive, stamped on these lifeless things,
    The hand that mocked them and the heart that fed:
    
    And on the pedestal these words appear:
    'My name is Ozymandias, king of kings:
    Look on my works, ye Mighty, and despair!'
    Nothing beside remains. Round the decay
    Of that colossal wreck, boundless and bare
    The lone and level sands stretch far away.
    

    The poem after 5 iterations:

    Dummies, by Percy Shgllcy
    1 Mn mm 1 from an arrqu land
    
    wm m1 Two m and mmkless leg; afsfon
    Smnd \n M desen near Menu, on Me Send
    Halfmnk, 1| shattered V‘Sage xles, whose frown
    m wr‘nkled up, m sneer amid command
    
    Tell mm M sculpror wel \ Mo; pass] an; read
    wn‘a yer gm '1 a, mmped on mgs‘ Hales; m‘ng;
    Th hand Mm mocked Men and M m Mm fed
    
    And 1| m pedefial mgs‘ words appear
    ‘My mm ‘5 mymnd‘fls, lung mam
    
    Look 1| my works, ye M‘m, aha dnga‘
    Nom‘ng Des‘d rema‘n; Round m dguy
    
    of mm (o xossal wrezk, boundless and bare
    Th Ion mlml Sandsm'am faraway
    

    Visit original content creator repository
    https://github.com/mouse-reeve/ozymandias

  • fungewars

    Fungewars

    Corewars in Funge

    Installation

    Prerequisites: C compiler, CMake build system, libpng, pthreads, OpenGL, GLFW 3.1

    If you download Fungewars via git clone --recursive, Git will download GLFW for you. Otherwise, you’ll need to manually put GLFW’s source in a directory inside the fungewars directory named glfw .

    CMake should be able to build Fungewars from there.

    I’d like Fungewars to work on any system, but I’ve only tested it on Gentoo Linux. I’m pretty sure it will work on any other Linux, and it might also work on OSX. I’m not sure if it will work on Windows under MinGW because I don’t know if MinGW supports pthreads, but that should be the only problem.

    Please file bugs or pull requests if you have any problems or solutions related to getting Fungewars to work on your system.

    Documentation

    TODO

    User Interface

    TODO

    Instruction List

    Under Construction

    char stack name op
    spc ( – ) nop
    ! (a – !a) not
    ( – string) string pushes cells until it hits another “, then goes back to normal mode

    |( – ) | skip | (x, y) += (dx, dy)

    $ |(a – ) | drop |
    % |(a b – a%b) | modulus |
    & |( – ) | |
    ‘ |( – get(x+dx, y+dy)) | fetch | (x, y) += (dx, dy)
    ( |( – ) | |
    ) |( – ) | |

    • |(a b – a*b) | multiply |
    • |(a b – a+b) | add |
      , |( – ) | |
    • |(a b – a-b) | subtract |
      . |( – ) | “https://github.com/”(a b – a/b) | divide |
      0 |( – 0) | push 0 |
      1 |( – 1) | push 1 |
      2 |( – 2) | push 2 |
      3 |( – 3) | push 3 |
      4 |( – 4) | push 4 |
      5 |( – 5) | push 5 |
      6 |( – 6) | push 6 |
      7 |( – 7) | push 7 |
      8 |( – 8) | push 8 |
      9 |( – 9) | push 9 |
      : |(a – a a) | dup |
      ; |( – ) | jump | pretends everything is a nop until it hits another ;
      < |( – ) | go left | (dx, dy) = (-1, 0)
      = |( – ) | |

    |( – ) | go right | (dx, dy) = ( 1, 0)
    ? |( – ) | go random | (dx, dy) = (1,0)|(0,1)|(-1,0)|(0,-1)
    @ |( – ) | die | kills thread
    A |( – ) | |
    B |(a – ) | bounce if | (dx, dy) = a>0 ? (-dx, -dy) : (dx, dy)
    C |( – ) | |
    D |( – ) | |
    E |( – ) | |
    F |( – ) | |
    G |( – ) | |
    H |( – ) | up-down if | (dx, dy) = a ? (1, 0) : (-1, 0)
    I |( – ) | right-left if | (dx, dy) = a ? (0, 1) : (0, -1)
    J |( – ) | |
    K |( – ) | |
    L |( – ) | |
    M |( – ) | |
    N |( – ) | |
    O |(a b – b a b) | over | same as forth OVER
    P |(n – push(stack[n]) | pick | same as forth PICK
    Q |( – ) | |
    R |( – ) | |
    S |( – ) | |
    T |( – ) | |
    U |( – ) | |
    V |( – ) | |
    W |( – ) | ccw-cw if | (dx, dy) = (a > b) ? (dx, dy) = (-dy, dx) : (a < b) ? (dx, dy) = (dy, -dx) : (dx, dy)
    X |( – ) | wall | (dx, dy) = (-dx, -dy); blocks p, g, j, “, ;
    Y |( – ) | |
    Z |( – ) | |
    [ |( – ) | | (dx, dy) = (-dy, dx)
    \ |(a b – b a) | swap | same as forth SWAP
    ] |( – ) | | (dx, dy) = (dy, -dx)
    ^ |( – ) | | (dx, dy) = (0, 1)
    _ |(a – ) | left-right if | (dx, dy) = a ? (-1, 0) : 1, 0)
    ` |(a b – a>b) | greater than |
    a |( – 10) | push 10 |
    b |( – 11) | push 11 |
    c |( – 12) | push 12 |
    d |( – 13) | push 13 |
    e |( – 14) | push 14 |
    f |( – 15) | push 15 |
    g |(y x – get(x,y) | get |
    h |( – ) | |
    i |( – ) | |
    j |(a – ) | jump | (x, y) += (dx, dy)*(a-1)
    k |(n – ) | iterate | (dx, dy) = (0, 0) but gets put back after n cycles
    l |( – ) | |
    m |( – ) | |
    n |(whole stack – ) | clear stack |
    o |( – ) | |
    p |(a y x – ) | put | put(x,y,a)
    q |( – ) | die | kills thread
    r |( – ) | reflect | (dx, dy) = (-dx, -dy)
    s |(char – ) | store | char = get(x+dx, y+dy); (x, y) += (dx, dy)
    t |( – ) | fork | clone: (child.dx, child.dy) = (-parent.dx, -parent.dy), otherwise identical
    u |( – ) | |
    v |( – ) | go down | (dx, dy) = (0, -1)
    w |(a b – ) | cw-ccw if | (dx, dy) = (a > b) ? (dx, dy) = (dy, -dx) : (a < b) ? (dx, dy) = (-dy, dx) : (dx, dy)
    x |(dy dx – ) | set velocity | (dx, dy) = (tos-1, tos)
    y |( – ) | |
    z |( – ) | nop |
    { |( – ) | |
    | |(a – ) | down-up if | (dx, dy) = a ? (0, -1) : (0, 1)
    } |( – ) | |
    ~ |( – ) | |

    Visit original content creator repository
    https://github.com/electrodude/fungewars

  • CompanyManagement

    企业人员信息管理系统

    Swing-based visual interface enterprise personnel information management system.

    基于 Swing 的可视化界面企业人员信息管理系统。

    一、需求分析:

    某小型公司,主要有三类人员:经理、兼职技术人员和兼职推销员。这三类人员共同拥有的相关属性:姓名、编号;相关方法:获取当月薪水的getPay()方法、显示个人信息的toString()方法。

    人员编号基数为1000,每创建一个人员实例对象,其编号属性的值顺序加1。月薪计算方法:经理拿固定月薪8000元;兼职技术人员按每小时100元领取月薪;兼职推销人员的月薪按当月的销售额的4%提成。

    要求:采用面向对象的编程思想,结合题意自己确定需要定义的类及各类的属性、构造方法和其他方法,并编写程序实现功能:

    1. 查询职工个人信息,可通过姓名、编号查询;
    2. 查询部门所有职工的详细信息;
    3. 修改职工信息;
    4. 删除职工信息;
    5. 添加职工信息;
    6. 查询所有职工信息,并将其存储到外设职工信息文件EmployeeData.txt中或者SQLServer数据库中,数据库中的表根据系统需求自己定义。

    二、概要设计:

    实现整个系统需要五个类文件。Employee类是所有人员的父类,Manager类、Saler类和Technician类继承于这个父类,并有自己的构造方法和其他方法,如图1所示。CompanyList类实现一个ArrayList集合,用来存放公司人员信息。其有增删改查等相关的方法,如图2所示。OperationPanel类是继承于JFrame类、实现ActionListener类的界面类,包含actionPerformed方法和main方法。

    Employee类及其子类:

    Employee类及其子类

    系统功能模块图:

    系统功能模块图

    三、详细设计:

    1. Employee类:

    String类型的变量name存放员工姓名,long类型的变量id存放员工编号,int类型的静态变量ID具有1000的初值,表示员工的编号基数。构造方法中将形参name放入域变量name,并让ID自增一次。

    1. Manager类:

    经理的工资因为是个常量,所以用double类型的变量salary来赋初值。构造方法调用父类的构造方法,并将自增后的ID放入id中。方法getPay()返回经理的工资数目,方法toString()返回其个人姓名、编号和工资。

    1. Saler类:

    销售人员类和经理类相似,只是重新定义一个double类型的salesNum变量,用来表示销售人员的销售额。在方法getPay()中,计算出工资并返回。

    1. Technician类:

    技术人员类和销售人员类相似,重新定义一个double类型的workHours变量,表示技术人员的工作小时数。在方法getPay()中,计算出工资并返回。

    1. CompanyList类:

    该类初始化一个ArrayList集合,用来存放公司所有人员信息。有以下几种方法:方法add()添加人员信息,方法remove()删除人员信息,方法modify()修改员工的姓名和编号,方法queryAll()用来查询所有人员的信息,方法query()查询单个员工的个人信息,方法save()可以将公司员工所有人员信息存放之外部EmployeeData.txt文件中。

    1. OperationPanel类:

    该类继承JFrame类,实现ActionListener接口。其中包含JLabel、JtextField、JButton、JeditorPane等Swing控件。在其构造方法中,使用采用了GridBagLayout布局的主面板,采用BoxLayout布局的子面板来放置各个功能模块的控件,并对每个按钮控件添加监听器。重写方法actionPerformed(),使其响应各个按钮对应的方法。在方法main()中初始化界面。

    布局原型图:

    布局原型图

    四、主要源程序代码:

    1. Employee类:

    Employee

    1. Manager类:

    Manager

    1. Saler类:

    Saler

    1. Technician类:

    Technician

    1. CompanyList类:(部分程序)

    CompanyLis

    1. OperationPanel类:(部分程序)

    OperationPanel

    五、程序运行结果

    程序运行结果

    六、源程序

    CompanyManagement 项目

    七、运行

    方式一:在右侧 Releases 中下载最新的 CompanyManagement.jar 文件,在本地环境的控制台使用 java -jar CompanyManagement.jar 命令运行即可。

    方式二(推荐):Fork 本项目代码,Clone 到本地环境,使用 Eclipse 或 IntelliJ 打开本项目工程,运行 OperationPanel 类的 main 方法即可。

    Visit original content creator repository https://github.com/sakiila/CompanyManagement
  • Flag-Quiz-MSProject2

    Flag-Quiz-Milestone-Project-2

    Flag Quiz Website

    A mock-up of the website on different devices

    Project Goals

    The primary goal of this site is to provide a fun and informative interactive quiz to test a user’s knowledge of country flags, giving users the opportunity to test their knowledge in three levels of difficulty.

    UX

    User goals

    The central audience for this site is people who would like to test their knowledge of flags or people who would like to learn more.

    Site user goals

    Users to this site would like to test their knowledge of world flags in a quick, fun and interactive way, as well as see their results and find out which flags they don’t know whether they are a beginner or more advanced in terms of their prior flag knowledge. This site will meet these goals because

    • The site will be fully interactive and click based, not requiring any typing or spelling.
    • The quiz is available in three difficulty levels to suit different levels of prior knowledge.
    • Quizzes are randomised, meaning that no one 30-second will ever be in the same order or with the same multiple choice in order to encourage users to replay and improve their skills.
    • Quizzes will be timed at 30 seconds maximum meaning users do not have to make any long time commitments.
    • A users will be able to save and track their scores and compare it to other users on the same device.
    • Visual feedback will be given to help users learn from their mistakes.

    Wireframes

    Wireframes

    User Story

    As a user who would like to play a flag trivia quiz, I want:

    1. An uncomplicated user interface which allows quick and initiative interaction.
    2. Clear and easy to understand feedback.
    3. The option to play a quiz that is suited to my knowledge level.
    4. Recognition of my positive achievements.
    5. Encouragement to continue playing in order to get better.

    Design Choices

    The overall design of the site is based on a single page , no scrolling layout, with minimum text. Questions, answers and user-feedback are designed and presented as visually as possible with a bare-minimum of typing required(only to enter your name if a user would like to save their score).

    • Font There is only one font used throughout the quiz which is Rubik. This font was chosen for its visually clarity and ability to stand out on the page especially in its heavier weights.

    • Colours

    The main consideration behind the colour palate of this site is having a primary background colour that does not clash with the flag. Colour is obviously very important in distinguishing flags and a background colour that is close to the white or red end of the spectrum would cause a lot of problems due to the high prevalence of those colours in world flags. As this site is aimed at front-end interactivity the buttons which a user presses needed to be of a significant contrast to the background as a call to action. Considering these factors, the following colour palette was created using the generator in Colormind.

    Site Colour Palette

    See this website for flag colour statistics. Statistics on flag Colours. Red and green are used throughout the site for negative and positive feedback (for incorrect/correct and for time running out and scoring ) in order to create a quick and text-free way of passing information on to the user.

    Features

    Existing Features

    Homepage

    A screenshot of the homepage

    • The homepage has a main title which reads Flag Quiz, a sub-heading asking the user ‘How well do you know the flags of the world?’ and a final line of text inviting the user to choose a difficulty level.
    • Below the text are three large buttons with the three levels of difficulty, easy, medium and difficult.
    • Upon clicking on one of the buttons the quiz will start.

    Main Quiz Page

    A screenshot of the quiz in action

    Header

    • Along the top of the page the question number, score, countdown timer and a close button are evenly spread out.
    • If the user selects the correct answer the score information will flash green as it increases.
    • When the user has only 10 seconds remaining the timer will start to flash red.
    • Upon clicking the close button the timer will pause and a modal will appear to ask the user if they are sure they want to quit the quiz or if they want to return to the game.

    Flag

    • A flag appears centered below the header and will change every time a user selects and answer until the time runs out.
    • For mobile, tablet and laptop screen sizes the flags all have a fixed height and variable widths depending on the ratios of each flag. On larger screens the flags have a fixed width and variable height as the API does not allow for fixed height flags larger than 240pixels.

    Answer buttons

    • Below the flags are four large buttons, each with the name of a different country.
    • If the user selects the correct answer for the displayed flag, the button’s colour will change to green and the next question will appear after 1 second.
    • If the user selects an incorrect answer for the displayed flag, the selected button’s background will change to red and the correct answer will be highlighted in green for 1 second until the next question appears. **

    Scorepage

    A screenshot of the scorepage with mistake button clicked

    • The default scorepage shows a message giving the user their total score and how many questions they answered in the 30 second time-limit.
    • If the user scored zero the message will read “Oh dear… you scored 0 points”.
    • If the user answers more questions wrong than right then the message will read ‘Not bad, you scored (X) points”.
    • If the user answers more questions right than wrong then the message will read ‘Well done, you scored (X) points”.
    • If the user answers all questions correct then the message will read ‘Outstanding, you scored (X) points”.
    • If the user made mistakes, a show mistakes button will appear below the text, which when clicked will show thumbnails of the flags they guessed incorrectly.
    • There are q further two buttons, one allowing the user to save their score, which when clicked will activate a modal prompting the user to enter their name.
    • After the user has entered their name a table will appear showing the names and scores of all site users and the save score button will be hidden to prevent the user re-saving their score.
    • The second button on the scorepage is a play again button which if pressed before saving the score, will ask the user if they want to save their score or if they want to go back to the homepage.

    Technologies Used

    Languages Used

    Frameworks, Libraries & Programs Used

    • Flagpedia

      • Used Flagpedia CDN in order to programmatically display the flags for the quiz.
    • Bootstrap 5

      • Imported CSS and JS, utilised grid system, navbar, form control and modals.
    • Google Fonts

      • Google fonts were used to import the font into the style.css file which is used on all pages throughout the project.
    • Git

      • Git was used for version control by utilizing VSCode to commit to Git and Push to GitHub.
    • Github

      • GitHub is used to store the projects code after being pushed from Git.
    • VS Code

      • Code was written and edited using VS Code.
    • Balsamiq

      • Balsamiq was used to create the wireframes during the design process.
    • Colormind

      • Used to generate a colour scheme for the site.
    • JSLint

      • Used to validate Javascript code.
    • Prettier

      • Used to format HTML,CSS and Javascript code.

    Testing

    Testing information can be found in this separate file.

    Deployment

    This site was developed using VS Code and live server and committed and pushed to Github through the VSCODE’s source control options.

    To deploy this page to GitHub Pages the following steps should be taken.

    1. Log in to GitHub
    2. Select the Flag-Quiz-MSProject-2 repository
    3. Click on Settings
    4. Select the Pages tab on the left sidebar.
    5. In the Source settings click on the dropdown menu that is currently displaying None.
    6. In the Select Branch settings change from None to Master.
    7. Click on Save and the link to the deployed page will appear automatically in a green box with a tick stating “Your site is published”.
    8. To run this site locally the following steps should be taken.

    To run this site locally the following steps should be taken.

    Run in Gitpod

    To run this site locally the following steps should be taken. Download Gitpod extension in chrome Log into Gitpod Go to the Github projects and select the Flag-Quiz-MSProject-2 repository. There should be a green Gitpod button on the top right next to the Code button Click the green Gitpod button A Gitpod workspace will load allowing the user to work locally.

    Run in an alternate IDE

    Go to GitHub projects and select the Flag-Quiz-MSProject-2 repository. Above the list of files click the Code button. In the Clone with HTTPs section, copy the clone URL for the repository. In your local IDE open the terminal. Change the current working directory to the desired location. Type git clone, and then paste the URL you copied in Step 3. Press Enter. Your local clone will be created.

    Credits

    Code

    let jsonStr = combinedStrings.replace(/(\w+:)|(\w+ :)/g, function(matchedStr) {
        return '"' + matchedStr.substring(0, matchedStr.length - 1) + '":';
      });

    Content

    • This site relies heavily on Flagpedia API in order to display the flags during and after the quiz programmatically.

    • The difficulty levels and resulting scoring system were adapted from these statistics from Sporcle’s Flag quiz showing how often flags were guessed correctly by players.

    Acknowledgements

    My CodeInstitute mentor, Antonija Simic, for her thorough and constructive feedback.

    My friends and family for helping testing the site.

    Visit original content creator repository https://github.com/jameskelly33/Flag-Quiz-MSProject2
  • Achilles-Gym

    Achilles Gym

    WordPress Theme for Gym

    The Achilles Gym project originated in college as an assignment for the subject CMS Systems.

    The project’s theme was to create a WordPress theme for a gym, utilizing custom post types, taxonomies, and custom meta-boxes.

    The website showcases all the knowledge acquired about using WordPress, which utilizes PHP programming language and MySQL for the database.

    My Skills


    Administrative Interface

    • The Program custom post type includes the Equipment custom post type, connected via a custom meta-box.
    • The Trainer custom post type includes the Program custom post type, also connected via a custom meta-box.
    • There is also the Interest custom post type.
    • Each custom post type has its unique taxonomy.

    On the website, you can:

    • Browse through points of interest.
    • Explore programs, their trainers, and equipment.
    • View trainers and their programs.
    • View equipment and the associated programs.
    • Find gym locations on the map.

    Project Setup

    You need to install XAMPP and run Apache and MySQL through it.

    Then, paste the Achilles-Gym folder into C:\xampp\htdocs\ and rename it to achilles_gym.

    Link to access the database: http://localhost/phpmyadmin/index.php.

    In phpMyAdmin, create a database named achilles_gym (Character Set should be Collation), and then import achilles_gym_final.sql located in the project’s root.

    Link to access the application: http://localhost/achilles_gym/wp-admin/.

    Visit original content creator repository https://github.com/AntonioSertic23/Achilles-Gym
  • Hyprland

    ArchLinux & Hyprland

    Hyprland

    Otras opciones de entorno de escritorio

    Además de Hyprland, hay varios otros entornos de escritorio populares disponibles para Arch Linux. Si estás interesado en explorar otras opciones, aquí tienes una recomendación:

    Qtile

    Qtile es un gestor de ventanas dinámico para X11 que se configura completamente en Python. Es ligero y altamente personalizable, lo que lo convierte en una excelente opción para aquellos que prefieren un entorno de escritorio más minimalista.

    Si deseas explorar la configuración personalizada de Qtile, echa un vistazo a mis dotfiles. de Qtile en GitHub.

    Tabla de contenidos

    Enlaces a consultar

    Arch Linux

    Instalacion de ArchLinux

    Debido a que la instalación puede variar, lo más recomendable es dirigirnos directamente a la guide installation y seguirla paso a paso para Arch Linux.

    Definir la distribución de teclado y fuente en consola

    Para configurar la distribucion de teclado en español

    loadkeys es

    Es posible que el tamaño de la fuente sea demasiado pequeño. Por ahora, podemos ajustar esto utilizando el siguiente comando:

    setfont ter-118n

    Conexion wifi

    iwctl
    station wlan0 scan       
    station wlan0 get-networks
    station wlan0 connect SSID

    Particionar y formatear el disco

    Optaremos por utilizar cfdisk debido a su facilidad de uso

    cfdisk

    Particionamos el disco utilizando cfdisk de la siguiente manera:

    • 300 MB – EFI SYSTEM
    • 15 GB – SWAP
    • Resto del espacio – /
      Para ver las particiones fuera de cfdisk, podemos utilizar el siguiente comando:
    lsblk

    Procedemos a formatear la partición SWAP

    mkswap /dev/sda2
    swapon /dev/sda2

    Procedemos a formatear la partición ROOT

    mkfs.ext4 /dev/sda3

    Procedemos a montar los sistemas de archivos

    mount /dev/sda3 /mnt

    Montamos la partición EFI

    mount --mkdir /dev/sda1 /mnt/boot

    Instalar paquetes esenciales

    pacstrap /mnt base base-devel linux linux-firmware linux-headers mkinitcpio networkmanager sudo grub efibootmgr nano iwd git

    Configuración del sistema

    Generamos un archivo fstab que contiene las particiones del sistema, utilizando UUID para montarlas automáticamente al inicio

    genfstab -U /mnt >> /mnt/etc/fstab

    Cambiamos el entorno de trabajo al sistema instalado en /mnt, permitiendo realizar configuraciones como si estuviéramos en el sistema recién instalado

    arch-chroot /mnt

    Creamos un enlace simbólico a la zona horaria deseada, configurando la hora local del sistema

    ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime

    Sincronizamos el reloj de hardware con la hora del sistema, asegurando que ambos estén alineados

    hwclock --systohc

    Abrimos el archivo de configuración de locales en el editor nano, donde se pueden activar los idiomas deseados

    nano /etc/locale.gen

    Generamos los locales especificados en el archivo /etc/locale.gen, permitiendo la utilización de diferentes idiomas y formatos regionales

    locale-gen

    Establecemos el idioma predeterminado del sistema, configurando la variable de entorno LANG a español

    echo LANG=es_ES.UTF-8 > /etc/locale.conf

    Crea el archivo vconsole.conf para establecer el mapa de teclado en español

    nano KEYMAP=es > /etc/vconsole.conf

    Definimos el nombre del host del sistema, que se utilizará en la red

    echo ArchLinux > /etc/hostname

    Cambiamos la contraseña del usuario root, asegurando el acceso seguro al sistema

    passwd

    Cremaos un usuario

    useradd -m -g users -G wheel -s /bin/bash jose  
    passwd

    Añadimos al usuario al archivo de sudoers

    nano /etc/sudoers

    Asegurarse de habilitar el servicio networkManager

    systemctl enable NetworkManager

    Instalacion del gestor de arranque

    Instalamos GRUB en modo EFI y asigna “Arch” como identificador del cargador de arranque

    grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=Arch
    grub-install --target=x86_64-efi --efi-directory=/boot --removable

    Generamos el archivo de configuración de GRUB

    grub-mkconfig -o /boot/grub/grub.cfg

    Finalización

    Reiniciamos el sistema, y si aparece el gestor de arranque de Arch, todo habrá salido correctamente.

    umount -R /mnt
    reboot

    Ahora creamos las carpetas personales básicas (Escritorio, Descargas, Música, etc.). Para ello, instalamos la herramienta xdg-user-dirs:

    sudo pacman -S xdg-user-dirs

    Finalmente, lo ejecutamos para generar nuestras carpetas

    xdg-user-dirs-update

    Hyprland

    Instalacion y config automatica

    Podemos ejecutar el script “install.sh” para instalar automáticamente todos los paquetes necesarios y copiar los archivos de configuración (dotfiles). Para hacerlo, simplemente ejecuta el siguiente comando:

    ./install.sh

    Una vez completada la ejecución, será necesario reiniciar el sistema para aplicar todos los cambios. Después de esto, la instalación estará finalizada

    Atajos de telcado

    A continuación se presentan los atajos de teclado configurados en mis dotfiles para facilitar el uso y la navegación. La tecla mod corresponde a la tecla de Windows:

    Sistema

    Acción Atajo
    mod + ENTER Abre una terminal (Kitty)
    mod + E Abre el explorador de archivos (Nemo)
    mod + M Abre el lanzador de aplicaciones (Rofi)
    mod + B Abre el navegador web (Brave)
    mod + C Abre el editor de código (VS Code)
    mod + S Realiza una captura de pantalla
    mod + L Bloquea el escritorio (Swaylock)
    mod + W Cierra la ventana activa
    mod + F Convierte una ventana a flotante
    mod + Space Pone la ventana en pantalla completa

    Focus

    Acción Atajo
    mod + H Mueve el foco a la izquierda
    mod + L Mueve el foco a la derecha
    mod + K Mueve el foco a la arriba
    mod + J Mueve el foco a la abajo

    Move

    Acción Atajo
    mod + ALT + H Mueve la ventana a la izquierda
    mod + ALT + L Mueve la ventana a la derecha
    mod + ALT + K Mueve la ventana a la arriba
    mod + ALT + J Mueve la ventana a la abajo

    Resize

    Acción Atajo
    mod + SHIFT + LEFT Redimensiona la ventana activa hacia la izquierda
    mod + SHIFT + RIGHT Redimensiona la ventana activa hacia la derecha
    mod + SHIFT + UP Redimensiona la ventana activa hacia arriba
    mod + SHIFT + DOWN Redimensiona la ventana activa hacia abajo

    Creditos

    Agradecimientos a @f3l3p1n0 por los dotfiles iniciales. Mi trabajo se basa en sus contribuciones.

    BlueHypr – f3l3p1n0

    Mejorar los mirrorlist

    Este proceso optimiza los servidores de espejo (mirrors) utilizados por pacman para mejorar la velocidad y eficiencia de las descargas de paquetes. A continuación, los pasos para actualizar tu lista de servidores:

    sudo pacman -S reflector rsync
    sudo reflector --verbose -l 10 --sort rate --save /etc/pacman.d/mirrorlist

    Instalar Docker

    Instalar Docker

    sudo pacman -S docker

    Habilitar el servicio de Docker

    sudo systemctl enable docker.service

    Añadir tu usuario al grupo de Docker

    sudo usermod -aG docker $USER

    Para más información sobre Docker y su uso, puedes consultar mi repositorio de Dcoker

    Instalar Virtual Box

    Instalar VirtualBox

    sudo pacman -S virtualbox

    Instalar los encabezados del núcleo LTS

    sudo pacman -S  linux-lts-headers

    Cargar los módulos de VirtualBox

    sudo modprobe vboxdrv vboxnetadp vboxnetflt vboxpci

    Añadir tu usuario al grupo vboxusers

    sudo gpasswd -a $USER vboxusers

    Instalar las herramientas de invitado de VirtualBox

    sudo pacman -S virtualbox-guest-iso

    KeePass

    Instalar KeePass usando Yay

    yay -S keepass

    Descomprimir el archivo del idioma español

    unzip KeePass-2.57-Spanish.zip

    Crear el directorio para los idiomas

    sudo mkdir /usr/share/keepass/Languages 

    Mover el archivo del idioma español al directorio correspondiente

    mv Spanish.lngx /usr/share/keepass/Languages

    Mover los plugins necesarios a la carpeta de plugins de KeePass

    sudo mv KeePassRPC.plgx YetAnotherFaviconDownloader.plgx KeeTheme.dll KeeTheme.plgx /usr/share/keepass/Plugins  

    Compartir pantalla

    Para habilitar el uso de la función de compartir pantalla en tu entorno, simplemente instala los siguientes paquetes. La configuración necesaria ya está incluida en los dotfiles para que funcione correctamente:

    sudo pacman -S pipewire wireplumber xdg-desktop-portal-hyprland

    Si algo no funciona como se espera o deseas más información, puedes consultar la documentación oficial sobre Screen Sharing

    Visit original content creator repository
    https://github.com/jose-016al/Hyprland

  • Stacked_Hourglass_Network_Keras

    Stacked_Hourglass_Network_Keras

    This is a Keras implementation for stacked hourglass network for single human pose estimation. The stacked hourglass network was proposed by [Stacked Hourglass Networks for Human Pose Estimation] (https://arxiv.org/abs/1603.06937). The official implementation built on top of torch is released under pose-hg-train, and pytorch version wrote by berapaw in repo pytorch-pose. Most of code for image processing and evaluation come from above repos.

    Folder Structure

    • data : data folder, mpii
    • images : pictures for demo
    • src : source code
      src/data_gen : data generator, augmentation and processnig code
      src/eval: evaluation code, eval callback
      src/net : net definition, hourglass network implementation
      src/tools: tool to draw accuracy curve and convert keras model to tf graph.
      top: top level entry to train/eval/demo network
    • trained_models : folder to restore trained models.

    Demo

    python demo.py --gpuID 0 --model_json ../../trained_models/hg_s2_b1/net_arch.json  --model_weights ../../trained_models/hg_s2_b1/weights_epoch89.h5  --conf_threshold 0.1 --input_image ../../images/sample.jpg
    

    Train

    MPII Data Preparation

    • Download MPII Dataset and put its images under data/mpii/images
    • The json mpii_annotations.json contains all of images’ annotations including train and validation.

    Train network

    • Train from scratch, use python train.py --help to check all the valid arguments.
    python train.py --gpuID 0 --epochs 100 --batch_size 24 --num_stack 2 --model_path ../../trained_models/hg_s2_b1_m
    
    • Arguments:
      gpuID gpu id, epochs number of epoch to train, batch_size batch size of samples to train, num_stack number of hourglass stack, model_path path to store trained model snapshot

    • Note: When mobile set as True, SeparableConv2D() is used instead of standard convolution, which is much smaller and faster.

    • Continue training from previous checkpoint

    python train.py --gpuID 0 --epochs 100 --batch_size 24 --num_stack 2 --model_path ../../trained_models/hg_s2_b1_m  --resume True --resume_model_json ../../trained_models/hg_s2_b1_m/net_arch.json --resume_model ../../trained_models/hg_s2_b1_m/weights_epoch15.h5 --init_epoch 16
    

    Eval

    Run evaluation on MPII validation dataset by using PCKh=0.5.

    python eval.py --gpuID 1 --model_weights ../../trained_models/hg_s2_b1_mobile/weights_epoch70.h5  --model_json ../../trained_models/hg_s2_b1_mobile/net_arch.json --mat_file ../../trained_models/hg_s2_b1_mobile/preds.mat --num_stack 2
    

    The validation score curve for hg_s2_b1 and hg_s2_b1_mobile

    curve

    Issues

    • Validation score drop significantly after 40 epochs. It is not stable as pytorch implementation. Did not root cause it yet.
    Visit original content creator repository https://github.com/yuanyuanli85/Stacked_Hourglass_Network_Keras
  • AutomaDesk

    AutomaDesk

    A powerful tool to organize your files and folders based on pre-defined rules, saving you time and effort in maintaining a clean and efficient digital workspace.

    Key Features

    Flexible Rule Creation

    Define rules to automatically move files based on extension (e.g., PDFs to a “Documents” folder, images to a “Pictures” folder).

    SQLite Database Integration

    Store rules persistently for easy access and management.

    User-Friendly Interface

    Interact with AutomaDesk through a visually appealing Tkinter GUI.

    Renaming Functionality

    Rename files using customizable patterns for enhanced organization.

    Search Capability

    Locate specific files within your designated source directory.

    Tech Stack

    • Python (Core functionality)
    • Tkinter (GUI development)
    • SQLite (Database storage)

    Installation

    Prerequisites

    Ensure you have Python 3 installed on your system. You can download it from Python Official Website.

    Clone the Repository

    Use Git to clone this repository to your local machine:

    git clone https://github.com/your-username/AutomaDesk.git

    Usage

    Run AutomaDesk

    Execute the main script (automadesk.py or similar) from your terminal.

    Source Directory

    Specify the directory containing the files you want to organize.

    Rule Management

    Creating Rules

    1. Enter the file extension in the “File Extension” field (e.g., “.pdf”).
    2. Specify the destination folder in the “Destination Folder” field (e.g., “C:/Documents”).
    3. Click the “Save Rule” button to establish the rule.

    Viewing Rules

    The “Current Rules” section displays the existing rules.

    Deleting Rules

    1. Enter the extension of the rule you want to remove in the “File Extension” field.
    2. Click the “Delete Rule” button to confirm removal.

    Organize Files

    Once rules are defined, click the “Organize Files” button to activate file organization based on the established rules.

    Renaming Files

    1. Click the “Browse” button next to the “File” field to select a file for renaming.
    2. Enter the desired new filename in the “New Filename” field.
    3. Click the “Rename” button to execute the renaming process.
      Search Files
    4. Type the search term for the files you want to locate in the “Search” field.
    5. Click the “Search” button to initiate the search. Results will be displayed in a message box.

    Customization

    The code provides a solid foundation. You can extend it to accommodate more complex rule-based organization, such as including subdirectories based on file content or creation date.

    Consider implementing visual feedback (progress bars, confirmation messages) to enhance the user experience.

    Contributing

    We welcome contributions to this project! Feel free to fork the repository, make your changes, and submit a pull request. We appreciate your interest in keeping AutomaDesk a valuable tool.

    License

    This project is licensed under the MIT License. You are free to use, modify, and distribute it under the terms of this license.

    Additional Notes

    For advanced usage or troubleshooting, refer to the code comments and documentation within the project.

    Consider creating a standalone executable using tools like PyInstaller to distribute AutomaDesk more easily (optional).

    Project Admin

    • Ashwin Kumar R

    Developer(s)

    • Ashwin Kumar R

    Communication Server

    https://discord.gg/XsYcNdFm46

    Visit original content creator repository
    https://github.com/Ash515/AutomaDesk

  • TabBarViewForAndroid

    TabBarViewForAndroid

    非常简单的为项目设置上TabBar

    效果展示

    效果1 效果2

    导入步骤

    • 下载项目,将tabbarview做为moudle导入
    • 在gradle的dependencies添加compile project(‘:tabbarview’)

    使用步骤

    1. 在需要使用TabBar的Activity中的布局文件加入TabBarView标签:
      <com.pzhu.tabbarview.TabBarView
          android:layout_width="match_parent"
          android:layout_height="match_parent">
      </com.pzhu.tabbarview.TabBarView>
    
    1. 添加命名空间  xmlns:app=”http://schemas.android.com/apk/res-auto
    2. 在TabBarView中加入子标签
     <com.pzhu.tabbarview.Page
               android:layout_width="100dp"
               android:layout_height="100dp"
               app:page="com.pzhu.test.fragment.AFragment"
               app:text="首页"
               app:icon_normal="@drawable/tab1"
               app:icon_select="@drawable/tab_click1"
               app:checked="true"
               app:text_color_normal="#777"
               app:text_color_select="#f00"
               />
    
    1. 完整代码:
      <com.pzhu.tabbarview.TabBarView
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <com.pzhu.tabbarview.Page
                android:layout_width="100dp"
                android:layout_height="100dp"
                app:page="com.pzhu.tabbartest.fragment.AFragment"
                app:text="首页"
                app:icon_normal="@drawable/tab1"
                app:icon_select="@drawable/tab_click1"
                app:checked="true"
                app:text_color_normal="#777"
                app:text_color_select="#f00"
                />
    
            <com.pzhu.tabbarview.Page
                android:layout_width="100dp"
                android:layout_height="100dp"
                app:page="com.pzhu.tabbartest.fragment.BFragment"
                app:text="个人中心"
                app:icon_normal="@drawable/tab2"
                app:icon_select="@drawable/tab_click2"
                app:text_color_normal="#777"
                app:text_color_select="#f00" />
    
        </com.pzhu.tabbarview.TabBarView>
    

    Page里属性含义

        text -> tab文字  
        icon_normal -> tab未选中时的图标
        icon_select -> tab选中时的图标
        checked -> 初始化选中项
        text_color_normal -> tab未选中时文字颜色
        text_color_select -> tab选中时文字颜色
        page -> tab对应的fragment tips:fragment包名加类名
    

    排列方式

      TabBar按照子节点排列顺序从左到右显示
    

    需要注意的地方

    fragment在每次显示到界面的时候都要进行重绘(了解fragment的应该知道这个机制),就是会多次调用onCreateView()方法,为了避免这个重复的重绘,所以需要在fragment里进行缓存,参考代码

    public class AFragment extends Fragment {
        private View rootView;
        private ProgressDialog myDialog;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            if (rootView == null) {
                TextView tv = new TextView(getActivity());
                tv.setText("AFragment");
                myDialog = new ProgressDialog(getActivity());
                myDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                myDialog.setMessage("处理中……");
                myDialog.setIndeterminate(false);
                myDialog.setCancelable(false);
                myDialog.show();
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        myDialog.dismiss();
                    }
                },3000);
                rootView = tv;
            }
            ViewGroup parent = (ViewGroup) rootView.getParent();
            if (parent != null) {
                parent.removeView(rootView);
            }
            return rootView;
        }
    }
    

    这是我测试用的,你们可以根据自己的需求来进行这部分。

    多余的话

      这个目前还有许多缺点,希望各位在使用的过程中有想要实现的需求或者不足的地方与我联系
      15680351591@163.com
      谢谢
    
    Visit original content creator repository https://github.com/wp529/TabBarViewForAndroid
  • RocketMQDedupListener

    RocketMQDedupListener

    通用的RocketMQ消息幂等去重消费者工具类,开箱即用

    1. 支持利用Redis或者MySQL做幂等表。
    2. 支持业务主键去重或消息ID去重(默认)
    3. 支持消息重复并发控制(重复的消息消费成功/失败前,不会同时消费第二条)
    4. 接近于EXACTLY-ONCE语义(消息只会且仅会被成功消费一次),极端场景下则为ATLEAST-ONCE语义(消息至少被成功消费一次,不会因为去重的增强而丢失消息)

    内置去重原理

    见以下流程图

    image

    去重实现的来龙去脉

    可以参考本人在官方微信发表的博文: RocketMQ消息幂等的通用解决方案

    Quick Start

    1、继承DedupConcurrentListener类,实现消费回调和去重键的设置回调

    public class SampleListener extends DedupConcurrentListener {
    
        public SampleListener(DedupConfig dedupConfig) {
            super(dedupConfig);
        }
    
        //基于什么做消息去重,每一类不同的消息都可以不一样,做去重之前会尊重此方法返回的值
        @Override
        protected String dedupMessageKey(MessageExt messageExt) {
            //为了简单示意,这里直接使用消息体作为去重键,正式使用时候不建议这样使用
            if ("TEST-TOPIC".equals(messageExt.getTopic())) {
                return new String(messageExt.getBody());
            } else {//其他使用默认的配置(消息id)
                return super.dedupMessageKey(messageExt);
            }
        }
    
        @Override
        protected boolean doHandleMsg(MessageExt messageExt) {
            switch (messageExt.getTopic()) {
                case "TEST-TOPIC":
                    log.info("假装消费很久....{} {}", new String(messageExt.getBody()), messageExt);
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {}
                    break;
            }
            return true;
        }
    }
    

    2、使用此实例启动RocketMQ 消费者

    
                DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("TEST-APP1");
                consumer.subscribe("TEST-TOPIC", "*");
    
                //START:区别于普通RocketMQ使用的代码
                String appName = consumer.getConsumerGroup();//针对什么应用做去重,相同的消息在不同应用的去重是隔离处理的
                StringRedisTemplate stringRedisTemplate = null;// 这里省略获取StringRedisTemplate的过程,具体的消息幂等表会保存到Redis中
                DedupConfig dedupConfig = DedupConfig.enableDedupConsumeConfig(appName, stringRedisTemplate);
                DedupConcurrentListener messageListener = new SampleListener(dedupConfig);
                //END:区别于普通RocketMQ使用的代码
    
    
                consumer.registerMessageListener(messageListener);
                consumer.start();
            
    

    注:

    1. 以上省略了RocketMQ消费者的配置及StringRedisTemplate的获取过程,需要使用者自己准备。
    2. RocketMQDedupListener支持使用Redis或MySQL进行去重,更多使用详情请见SampleListener.java

    使用场景测试

    以下是部分实验的输出日志及现象,读者可以参考观察实验(基于SampleListener.java的实现)

    一、测试普通的消息重复:

    1. 模拟正常消息:发送消息到TEST-TOPIC, 报文为,test-ljj-msg1234
    2. 模拟重复消息:隔几秒后(这个例子需要大于3秒),再发送消息到TEST-TOPIC,报文一样是test-ljj-msg1234

    日志输出如下:

    [INFO] 2020-05-15 11:06:17,697 []  >>> 假装消费很久....test-ljj-msg1234 MessageExt [queueId=1, storeSize=169, queueOffset=0, sysFlag=0, bornTimestamp=1589511454575, bornHost=/10.13.32.179:52637, storeTimestamp=1589511454576, storeHost=/10.13.32.179:10911, msgId=0A0D20B300002A9F000000003EEA31B0, commitLogOffset=1055535536, bodyCRC=1038040938, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=TEST-TOPIC, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=1, CONSUME_START_TIME=1589511977328, UNIQ_KEY=0A0D20B3632A5B2133B14A730F6F014A, WAIT=true}, body=16]]
    [INFO] 2020-05-15 11:06:20,748 []  >>> consume [1] msg(s) all successfully
    [WARN] 2020-05-15 11:06:26,504 []  >>> message has been consumed before! dedupKey = DedupElement={"application":"repay-platform-core","msgUniqKey":"test-ljj-msg1234","tag":"","topic":"TEST-TOPIC"}, msgId : 0A0D20B3632A5B2133B14A7332DB014B , so just ack. RedisPersist
    [INFO] 2020-05-15 11:06:26,504 []  >>> consume [1] msg(s) all successfully
    

    说明:

    可以看到第二条消息被直接幂等掉了,没有进入业务的测试代码

    测试并发重复消费:

    1. 模拟正常消息:发送消息到TEST-TOPIC, 报文为 test-ljj-msg123
    2. 模拟重复消息:马上(这个例子需要小于3秒)再发送消息到TEST-TOPIC,报文一样是 test-ljj-msg123

    由于这里需要一些特殊说明,以下日志增加了注释

    33秒第一条消息到达,这里消息会消费3秒
    [INFO] 2020-05-15 11:07:33,756 []  >>> 假装消费很久....test-ljj-msg123 MessageExt [queueId=1, storeSize=168, queueOffset=2, sysFlag=0, bornTimestamp=1589511530879, bornHost=/10.13.32.179:52651, storeTimestamp=1589511530881, storeHost=/10.13.32.179:10911, msgId=0A0D20B300002A9F000000003EEA3302, commitLogOffset=1055535874, bodyCRC=146853239, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=TEST-TOPIC, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=3, CONSUME_START_TIME=1589512053623, UNIQ_KEY=0A0D20B3632A5B2133B14A74397F014C, WAIT=true}, body=15]]
    
    35秒重复消息到达,发现前面的消息还在消费
    [WARN] 2020-05-15 11:07:35,884 []  >>> the same message is considered consuming, try consume later dedupKey : DedupElement={"application":"repay-platform-core","msgUniqKey":"test-ljj-msg123","tag":"","topic":"TEST-TOPIC"}, 0A0D20B3632A5B2133B14A7441FB014D, RedisPersit
    消费按消费失败处理,触发延迟消费
    [WARN] 2020-05-15 11:07:35,884 []  >>> consume [1] msg(s) fails, ackIndex = [-1]
    
    36秒第一条消息消费成功
    [INFO] 2020-05-15 11:07:36,801 []  >>> consume [1] msg(s) all successfully
    
    46秒第二条消息延迟消费开始,发现这条消息已经被成功消费
    [WARN] 2020-05-15 11:07:46,024 []  >>> message has been consumed before! dedupKey = DedupElement={"application":"repay-platform-core","msgUniqKey":"test-ljj-msg123","tag":"","topic":"TEST-TOPIC"}, msgId : 0A0D20B3632A5B2133B14A7441FB014D , so just ack. RedisPersit
    
    直接按照消费成功处理
    [INFO] 2020-05-15 11:07:46,024 []  >>> consume [1] msg(s) all successfully
    

    说明:

    可以看到第二条消息在第一条消息消费的过程中就投递到消费者了,这时候去重逻辑做了并发控制,保证了业务代码的安全。


    MYSQL去重支持

    若希望使用MYSQL存储消息消费记录,使用上仅需把StringRedisTemplate改成JdbcTemplate:

            JdbcTemplate jdbcTemplate = null;// 这里省略获取JDBCTemplate的过程,幂等表将使用MySQL的t_rocketmq_dedup存储
            DedupConfig dedupConfig = DedupConfig.enableDedupConsumeConfig(appName, jdbcTemplate);
    

    同时需要预先建立一张消息去重表,结构如下:

    -- ----------------------------
    -- Table structure for t_rocketmq_dedup
    -- ----------------------------
    DROP TABLE IF EXISTS `t_rocketmq_dedup`;
    CREATE TABLE `t_rocketmq_dedup` (
    `application_name` varchar(255) NOT NULL COMMENT '消费的应用名(可以用消费者组名称)',
    `topic` varchar(255) NOT NULL COMMENT '消息来源的topic(不同topic消息不会认为重复)',
    `tag` varchar(16) NOT NULL COMMENT '消息的tag(同一个topic不同的tag,就算去重键一样也不会认为重复),没有tag则存""字符串',
    `msg_uniq_key` varchar(255) NOT NULL COMMENT '消息的唯一键(建议使用业务主键)',
    `status` varchar(16) NOT NULL COMMENT '这条消息的消费状态',
    `expire_time` bigint(20) NOT NULL COMMENT '这个去重记录的过期时间(时间戳)',
    UNIQUE KEY `uniq_key` (`application_name`,`topic`,`tag`,`msg_uniq_key`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
    
    
    

    说明:因为需要支持不同的应用,所以需要存储application_name,因为同一个业务主键可能来自不同的topic/tag,所以也需要存储起来。

    一直消费失败会否引起死循环

    不会。失败/消费中触发的延迟消费依赖与RocketMQ原生的重试机制,默认是16次。如果有希望调整延迟的时间和重试次数,需要自行调整Consumer配置。

    关于作者

    Apache RocketMQ Committer,知乎专栏 RocketMQ详解作者,RoceketMQ官微投稿者

    Visit original content creator repository https://github.com/Jaskey/RocketMQDedupListener