Blog

  • Food-app

    Food App README

    Introduction

    Welcome to Food App! This Java-based application utilizes XML for user interface design. Food App connects users with food suppliers, providing a convenient shopping and ordering experience. It includes intelligent features such as a Wit.AI-powered chatbot and admin management.

    Features

    1. Product Search

      • Users can easily search for food products by name, category, or keywords.
      • Clear search results help users quickly find what they need.
    2. Ordering

      • Food App allows users to order food products from suppliers.
      • The ordering process is simple and straightforward, including cart review, payment method selection, and order confirmation.
    3. Smart Chatbot

      • Using Wit.AI AI technology, the chatbot in Food App interacts and addresses user queries.
      • The chatbot provides product information, assists with ordering issues, and supports customer service.
    4. Admin Management

      • Admin can manage product listings, orders, and user information.
      • An easy-to-use interface enables efficient addition, modification, and deletion of information.
    5. User Profile Management

      • Users can manage personal information, delivery addresses, and purchase history.
      • Editing and updating information is straightforward from the user interface.

    Installation and Deployment

    System Requirements

    • Android Studio version X.X.X or higher.
    • JDK version X.X or higher.
    • Install Firebase and configure your project in Firebase Console.

    Deployment

    1. Clone the Repository:

    2. Open Project in Android Studio:

    • Import the project into Android Studio.
    • Configure Firebase for your project (refer to Firebase documentation).
    1. Configure Wit.AI API:
    • Register and obtain API key from Wit.AI.
    • Configure the source code to connect with the chatbot.
    1. Build and Run the Application:
    • Build and run the application on an emulator or physical device.

    Contributions and Feedback

    If you have any suggestions or bug reports, please open an issue on our GitHub repository. We welcome contributions from the community to improve Food App.

    Image of application

    Start

    Start

    Main

    Main

    Order

    Order

    Order

    Order

    User

    User

    Edit profile

    Edit profile

    Sign In

    Sign In

    Sign Up

    Sign Up

    Author

    Food App is developed by Võ Thanh Sang, with support from the open-source community and cutting-edge technologies.

    Thank you for your interest in and usage of Food App. We hope you have an enjoyable and convenient shopping experience! 🍲📱

    Visit original content creator repository https://github.com/vthanhsang/Food-app
  • react-atom

    title

    star version minzip downloads license

    Packages 📦

    Quick Features 🥳

    • Build application atomically with your design tokens.
    • Supported emotion and styled-components.
    • Built with typescript, provide type protection, code autocompletion, make your app robust.

    How to use 📖

    Install package

    # use emotion
    npm install @emotion/react @emotion/styled react-atom-emotion
    
    # use styled-components
    npm install styled-components react-atom-styled

    Define your design tokens

    Create a file named designTokens.ts in your project.

    export const designTokens = {
      spacing: {
        '1x': '8px',
        '2x': '16px',
        '4x': '32px',
        full: '100%',
        fullW: '100vw',
        fullH: '100vh',
      },
      color: {
        primary: '#4CB074',
        background: '#ECF5F0',
      },
      fontSize: {
        xxl: '32px',
        xl: '38px',
        lg: '24px',
        md: '16px',
        sm: '14px',
        xs: '12px',
      },
    };

    Create Atom component

    Create a file named Atom.tsx in your project.

    // You also can use react-atom-styled here
    import atom from 'react-atom-emotion';
    import { designTokens } from './designTokens';
    
    export const Atom = atom(designTokens);

    Build application atomically with your design tokens

    import { Atom } from './Atom';
    
    export default function App() {
      return (
        <Atom
          w="fullW"
          h="fullH"
          flex
          flexDirection="column"
          flexJustify="center"
          flexAlign="center"
          gap="1x"
          c="primary"
          bg="background"
        >
          <Atom fontSize="xxl" fontWeight="bold">
            Hello, React Atom!
          </Atom>
          <Atom fontSize="md">Build application atomically with your design!</Atom>
        </Atom>
      );
    }

    Click here to try it by yourself.

    Visit original content creator repository https://github.com/react-earth/react-atom
  • autohotkey-german-programmer-layer

    autohotkey-german-programmer-layout

    A Keyboard Layout based on Standard German QWERTZ with the addition of two layers.

    To use the script, you have to install AutoHotKey.

    A lot of characters on the German keyboard which you need for programming are not accessible very well.

    The script adds two layers to the keyboard. One layer is for easy access to those characters which are needed all the time for programming. The other layer controls the cursor and have a numberblock.

    The script is adapted to German keyboards. But it can be easily adapted to other keboards or your own needs. I realised, that with that script using a QWERTY Keyboard and installing the German keyboard layout under Windows is more convenient, because it is easier to reach the left SHIFT and the RETURN Key.

    Because of the fact that the SPACE and ä keys are used to switching the layer they will fire upon release. The advantage is that although the keys will fire upon release, it will do so only if you did not press any other key while it was held down.

    The following layer can be activated by holding Caps Lock, ä or # down. The normal functionality of Caps Lock and the key # is deactivated!

    The following layer can be activated by holding Space down. If you press the Space key short, a Space character is printed (when the Space key is released). If you want a continous printing of Space you have to hold down Space and press Alt. The layer was designed like the Ebene 4 of the neo-layout.org – but not exactly.

    Explanation in German:

    Die Zeichen wurden so angeordnet, dass diese recht einfach zu erlernen sind. Da bei der Programmierung die meisten verwendeten Sonderzeichen die Klammern sind, wurden diese auf die rechte Hand und in die mittlere Reihe gelegt. Da moderne IDEs bereits eine Klammer zu automatisch anhängen, wurden diese in die untere Reihe gelegt, da diese weniger verwendet werden. Vielmehr besteht nun der Anspruch, schnell an das Zeilenende zu gelangen und dann dort Enter zu drücken oder “{ und Enter” oder “( und Enter”. Diese Kombinationen wurden auf die obere Reihe der Tastatur gelegt.

    Hier ein paar Eselsbrücken um sich die Belegung zu merken:

    Die spitze Klammer auf zeigt nach links -> Zeigefinger nach links

    Runde Klammer sieht aus wir das J unten.

    Die rechte Seite vom K sieht aus wie {.

    Die Eckigel Klammer ist eckig wie das L.

    Die Klammer zu ist unter der Klammer auf.

    Das Z ist das Ende des Alphabets. Mit Z springe ich zum Ende der Zeile und drücke Enter.

    Über der geschweiften Klammer setze ich eine geschweifte Klammer an das Ende und drücke Enter.

    Rechts daneben passiert das gleiche bloß mit einem Semikolen.

    Das einfache Anführungszeichen ist klein wie der kleine Finger.

    Das doppelte Anführungszeichen ist rechts daneben.

    Das C sieht fast aus wie ein €.

    A => Ausrufezeichen

    F => Fragezeichen

    G => Gleichheitszeichen

    S => Stern (Mal) usw…

    Der linke Mittelfingeringer ist der senkrechte Strich und stellt die mittlere Stange eines Zelte dar.

    Links daneben ist die eine Dachschräge (Slash)

    Rechts daneben ist die andere Dachschräge (Backslash)

    Da bei schnellem Tippen es häufig wesentlich effektiver ist, dass falsche Wort zu löschen und neu zu tippen wurde der “del word” Befehl auf Tab und Q gelegt.

    Visit original content creator repository https://github.com/kwrtz/autohotkey-german-programmer-layer
  • SalahKart

    Internship Experience

    Software Engineer Intern

    SalahKart- A Product of Jaspy Technologies Pvt. Ltd.

    CIN: U78100UP2024PTC199951

    Duration: 2 months

    Roles and Responsibilities:

    • NLP and Web Scraping:
      • Employed BeautifulSoup and Selenium WebDriver to scrape data from LinkedIn profiles.
      • Conducted resume parsing, extracting skills from resumes and job descriptions to calculate the matching percentage.
    • Skill Matching and Semantic Textual Similarity (STS):
      • Implemented three primary methods for skill matching:
        • SentenceTransformer Model
        • CrossEncoder Model
        • Dictionary Method using a predefined skill list from a CSV file.
      • Combined the methods using a normalized formula to compute the final skill matching percentage.
      • Conducted Semantic Textual Similarity (STS) for accurate skill assessment.
    • Natural Language Processing (NLP):
      • Utilized SpaCy and NLTK for advanced NLP tasks.
      • Developed a Named Entity Recognition (NER) pipeline using Transformers by Hugging Face.
      • Extracted nouns and verbs from resumes on a section-wise basis for enhanced resume analysis.
    • Development and Testing:
      • Developed and tested code in Python using NumPy, Pandas, and regular expressions.
      • Used VS Code and Google Colab for coding and collaboration.
      • Designed and documented workflow using Lucid Chart for flow diagrams and brainstorming sessions.
      • Created a backend database with a Level 2 ER Diagram using the Eraser.io.
      • Performed unit and integration testing manually to ensure code quality and reliability.

    Technical Skills:

    • Programming Languages: Python
    • Libraries & Frameworks: SpaCy, NLTK, NumPy, Pandas, BeautifulSoup, Selenium WebDriver
    • Machine Learning Models: SentenceTransformer, CrossEncoder
    • Tools: VS Code, Google Colab, Lucid Chart, Eraser.io
    • Database Design: Level 2 ER Diagrams
    • Testing: Manual Unit and Integration Testing
    • Additional Skills: Transformers, NLP, Web Scraping, Semantic Textual Similarity (STS), Named Entity Recognition (NER)

    Alert

    Provided Codes don’t represent my complete work during internship and are Incomplete and partial. It’s only for preview and educational purposes. These are not the Final production grade codes either. Kindly use it with caution ⚠

    Visit original content creator repository
    https://github.com/adarsh-k27r/SalahKart

  • fake-new-domains-web

    Fake New Domains:

    Overview:

    Fake New Domains is an application designed to protect against phishing by detecting newly created domains and facilitating the creation of blacklists to prevent fraudulent sites efficiently. This tool helps users explore detected occurrences among newly created domains and prepares blacklists for potential fraudulent domains in the most agile way possible.

    Features:

    • Phishing Detection: Identify newly registered domains that may be used for phishing attacks.
    • Domain Patterns: Select and analyze specific domain patterns.
    • Blacklist Creation: Easily create and manage blacklists of suspicious domains.
    • Automated Updates: Automatically fetch and update the list of new domains.

    Usage:

    Web Interface:

    1. Use the dropdown menu to select the domain pattern you want to analyze.
    2. Click on “Add Selected” to add domains to the list.
    3. Use the buttons to export the selected domains o clear the list.

    Contributing:

    1. Fork the repository.
    2. Create a new branch (git checkout -b feature-branch).
    3. Make your changes and commit them (git commit -am 'Add new feature').
    4. Push to the branch (git push origin feature-branch).
    5. Create a new Pull Request.

    How to try:

    You can use docker, to do that you only have to execute the followed command:

    docker pull juanse77/fake-new-domains-web:latest
    docker run --rm -p 5000:5000 juanse77/fake-new-domains-web:latest

    Now, you can access to the application in http://localhost:5000

    License:

    This project is licensed under the MIT License.

    Contact:

    For any questions or support, please contact juanse77-ccdani@hotmail.com.

    Donate:

    If you want to contribute to our initiative, please support us with a coffee ;D

    © 2024 Fake New Domains

    Visit original content creator repository
    https://github.com/juanse77/fake-new-domains-web

  • haisi-encoding

    海嗣语编码

    (阴暗地蠕动)(阴暗的爬行)(爬行)(爬行)(分裂)(蠕动)(尖叫)(阴暗的爬行)(翻滚)(阴暗的爬行)(嘶吼)(嘶吼)(爬行)(不分对象攻击)(翻滚)(不分对象攻击)(嘶吼)(阴暗地蠕动)(爬行)(不分对象攻击)(激烈地爬动)(痉挛)(翻滚)(阴暗地蠕动)(分裂)(扭动)(痉挛)(阴森的低吼)

    这是什么?

    闲着无聊搓的一个不知道算不算编码的东西,可以将人话翻译为海嗣语

    灵感来自于社会主义核心价值观编码但是咱的技术力极低还一大堆错

    怎么用?

    将项目clone到本地,然后执行命令

    git clone git@github.com:SherkeyXD/haisi-encoding.git
    cd haisi-encoding

    随后参照使用帮助来使用

    python3 main.py
    使用方法:
        python3 main.py decode 要解码的文字 密码(可选)
        python3 main.py encode 要编码的文字 密码(可选)
    

    提示:若需要编码的文字内部有空格,请用引号包起

    作者的话

    (不分对象攻击)(嘶吼)(分裂)(扭曲的行走)(蠕动)(嘶吼)(嘶吼)(扭动)(翻滚)(翻滚)(阴暗的爬行)(嘶吼)(阴暗地蠕动)(爬行)(阴森的低吼)(阴森的低吼)(不分对象攻击)(激烈地爬动)(痉挛)(阴森的低吼)(扭曲)(翻滚)(走上岸)(阴暗的爬行)(爬行)(痉挛)(痉挛)(分裂)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(尖叫)(扭曲的行走)(尖叫)(不分对象攻击)(痉挛)(激烈地爬动)(嘶吼)(不分对象攻击)(扭动)(扭曲的行走)(翻滚)(分裂)(激烈地爬动)(扭曲)(扭曲的行走)(痉挛)(扭动)(爬行)(爬行)(不分对象攻击)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭曲)(蠕动)(走上岸)(扭曲)(蠕动)(尖叫)(阴暗地蠕动)(阴暗地蠕动)(走上岸)(尖叫)(阴暗的爬行)(不分对象攻击)(嘶吼)(痉挛)(嘶吼)(阴暗的爬行)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(蠕动)(嘶吼)(分裂)(不分对象攻击)(扭曲的行走)(走上岸)(嘶吼)(阴暗的爬行)(阴森的低吼)(翻滚)(阴森的低吼)(痉挛)(阴暗的爬行)(激烈地爬动)(阴森的低吼)(翻滚)(阴森的低吼)(阴暗的爬行)(扭动)(不分对象攻击)(扭曲)(痉挛)(不分对象攻击)(阴森的低吼)(蠕动)(阴暗地蠕动)(痉挛)(爬行)(扭曲)(分裂)(走上岸)(痉挛)(走上岸)(阴暗的爬行)(嘶吼)(尖叫)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(激烈地爬动)(爬行)(扭曲)(爬行)(阴森的低吼)(蠕动)(不分对象攻击)(走上岸)(阴森的低吼)(扭动)(扭曲的行走)(激烈地爬动)(嘶吼)(扭动)(痉挛)(尖叫)(痉挛)(不分对象攻击)(爬行)(尖叫)(爬行)(不分对象攻击)(走上岸)(阴暗地蠕动)(翻滚)(翻滚)(激烈地爬动)(阴暗的爬行)(翻滚)(翻滚)(阴暗的爬行)(嘶吼)(翻滚)(蠕动)(痉挛)(阴暗地蠕动)(爬行)(尖叫)(嘶吼)(嘶吼)(走上岸)(嘶吼)(痉挛)(翻滚)(扭曲)(分裂)(走上岸)(痉挛)(走上岸)(阴暗的爬行)(嘶吼)(尖叫)(嘶吼)(分裂)(翻滚)(阴暗地蠕动)(扭曲的行走)(嘶吼)(阴暗的爬行)(阴暗地蠕动)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(阴森的低吼)(爬行)(不分对象攻击)(激烈地爬动)(扭曲的行走)(痉挛)(阴暗的爬行)(痉挛)(扭曲)(蠕动)(走上岸)(扭曲)(阴暗地蠕动)(爬行)(尖叫)(激烈地爬动)(嘶吼)(分裂)(扭曲)(阴森的低吼)(阴森的低吼)(阴森的低吼)(尖叫)(扭曲)(翻滚)(翻滚)(激烈地爬动)(阴暗的爬行)(走上岸)(翻滚)(扭动)(阴暗的爬行)(爬行)(不分对象攻击)(走上岸)(阴暗地蠕动)(尖叫)(不分对象攻击)(不分对象攻击)(阴森的低吼)(嘶吼)(阴暗的爬行)(扭曲的行走)(阴暗地蠕动)(激烈地爬动)(扭动)(扭曲)(翻滚)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(扭曲)(嘶吼)(尖叫)(痉挛)(激烈地爬动)(扭曲的行走)(扭曲的行走)(蠕动)(走上岸)(痉挛)(激烈地爬动)(翻滚)(扭曲)(不分对象攻击)(嘶吼)(走上岸)(痉挛)(阴森的低吼)(爬行)(走上岸)(扭曲)(蠕动)(走上岸)(扭曲)(走上岸)(翻滚)(扭动)(阴暗的爬行)(痉挛)(尖叫)(走上岸)(激烈地爬动)(分裂)(尖叫)(嘶吼)(扭动)(尖叫)(尖叫)(激烈地爬动)(扭曲的行走)(分裂)(扭曲的行走)(蠕动)(不分对象攻击)(阴暗的爬行)(不分对象攻击)(扭曲的行走)(扭曲)(扭动)(翻滚)(阴暗的爬行)(扭动)(嘶吼)(翻滚)(阴暗的爬行)(扭曲的行走)(扭曲)(走上岸)(走上岸)(痉挛)(不分对象攻击)(嘶吼)(分裂)(扭曲的行走)(嘶吼)(扭动)(痉挛)(尖叫)(激烈地爬动)(扭动)(激烈地爬动)(爬行)(翻滚)(激烈地爬动)(分裂)(扭曲的行走)(扭曲的行走)(分裂)(阴森的低吼)(扭曲)(嘶吼)(尖叫)(激烈地爬动)(蠕动)(阴暗地蠕动)(不分对象攻击)(激烈地爬动)(激烈地爬动)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(分裂)(痉挛)(扭曲)(翻滚)(阴森的低吼)(不分对象攻击)(爬行)(翻滚)(爬行)(尖叫)(扭曲)(阴暗的爬行)(扭曲)(翻滚)(蠕动)(不分对象攻击)(扭曲的行走)(扭曲的行走)(蠕动)(走上岸)(扭动)(扭曲的行走)(蠕动)(痉挛)(爬行)(阴暗的爬行)(嘶吼)(爬行)(蠕动)(阴暗地蠕动)(走上岸)(翻滚)(走上岸)(痉挛)(激烈地爬动)(翻滚)(不分对象攻击)(嘶吼)(分裂)(扭曲的行走)(激烈地爬动)(激烈地爬动)(爬行)(激烈地爬动)(翻滚)(翻滚)(激烈地爬动)(阴暗的爬行)(蠕动)(嘶吼)(嘶吼)(扭动)(翻滚)(翻滚)(阴暗的爬行)(嘶吼)(尖叫)(扭曲的行走)(尖叫)(不分对象攻击)(痉挛)(激烈地爬动)(嘶吼)(不分对象攻击)(扭动)(翻滚)(阴暗的爬行)(扭动)(尖叫)(嘶吼)(嘶吼)(翻滚)(扭曲)(蠕动)(走上岸)(扭曲)(走上岸)(翻滚)(扭动)(阴暗的爬行)(阴森的低吼)(翻滚)(阴森的低吼)(痉挛)(蠕动)(扭曲)(痉挛)(嘶吼)(不分对象攻击)(扭曲)(爬行)(痉挛)(阴暗地蠕动)(不分对象攻击)(嘶吼)(尖叫)(扭曲的行走)(分裂)(阴森的低吼)(扭曲)(翻滚)(翻滚)(激烈地爬动)(阴暗的爬行)(阴暗地蠕动)(爬行)(尖叫)(激烈地爬动)(阴暗的爬行)(阴暗的爬行)(痉挛)(蠕动)(分裂)(痉挛)(扭动)(痉挛)(扭动)(不分对象攻击)(扭曲的行走)(阴暗的爬行)(走上岸)(痉挛)(激烈地爬动)(翻滚)(不分对象攻击)(阴暗地蠕动)(扭曲的行走)(痉挛)(扭曲的行走)(走上岸)(阴暗地蠕动)(嘶吼)(痉挛)(阴森的低吼)(爬行)(走上岸)(扭曲的行走)(分裂)(扭曲)(不分对象攻击)(走上岸)(翻滚)(扭动)(阴暗的爬行)(痉挛)(走上岸)(不分对象攻击)(尖叫)(翻滚)(翻滚)(嘶吼)(扭动)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(阴森的低吼)(阴暗的爬行)(扭曲的行走)(蠕动)(扭曲)(嘶吼)(扭曲的行走)(扭动)(扭动)(翻滚)(扭曲的行走)(激烈地爬动)(分裂)(激烈地爬动)(尖叫)(嘶吼)(尖叫)(翻滚)(痉挛)(扭动)(扭曲的行走)(阴森的低吼)(分裂)(阴暗地蠕动)(爬行)(扭曲的行走)(扭曲的行走)(蠕动)(阴暗地蠕动)(不分对象攻击)(激烈地爬动)(激烈地爬动)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(阴暗的爬行)(嘶吼)(走上岸)(翻滚)(阴暗的爬行)(分裂)(分裂)(扭曲的行走)(尖叫)(扭曲)(蠕动)(蠕动)(尖叫)(扭曲)(蠕动)(蠕动)(痉挛)(爬行)(翻滚)(扭动)(痉挛)(爬行)(翻滚)(扭动)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(爬行)(尖叫)(扭曲)(阴暗的爬行)(扭曲)(翻滚)(蠕动)(不分对象攻击)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(痉挛)(扭曲)(爬行)(扭动)(爬行)(激烈地爬动)(激烈地爬动)(扭曲)(嘶吼)(蠕动)(翻滚)(阴森的低吼)(走上岸)(痉挛)(激烈地爬动)(翻滚)(走上岸)(爬行)(阴暗地蠕动)(尖叫)(尖叫)(嘶吼)(嘶吼)(翻滚)(扭曲)(蠕动)(走上岸)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(蠕动)(扭曲)(扭曲)(分裂)(蠕动)(不分对象攻击)(扭曲的行走)(嘶吼)(翻滚)(痉挛)(不分对象攻击)(激烈地爬动)(扭动)(走上岸)(扭曲的行走)(扭曲)(嘶吼)(嘶吼)(痉挛)(扭曲的行走)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(蠕动)(扭曲)(扭曲)(分裂)(蠕动)(不分对象攻击)(扭曲的行走)(嘶吼)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(不分对象攻击)(扭动)(嘶吼)(爬行)(爬行)(不分对象攻击)(激烈地爬动)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(不分对象攻击)(扭动)(嘶吼)(爬行)(爬行)(不分对象攻击)(激烈地爬动)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(不分对象攻击)(扭动)(嘶吼)(爬行)(爬行)(不分对象攻击)(激烈地爬动)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(蠕动)(扭曲)(扭曲)(分裂)(蠕动)(不分对象攻击)(扭曲的行走)(嘶吼)(翻滚)(痉挛)(不分对象攻击)(激烈地爬动)(扭动)(走上岸)(扭曲的行走)(扭曲)(嘶吼)(嘶吼)(痉挛)(扭曲的行走)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(阴暗地蠕动)(嘶吼)(尖叫)(扭曲的行走)(阴暗的爬行)(不分对象攻击)(扭曲)(痉挛)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(扭动)(走上岸)(扭曲的行走)(扭曲)(嘶吼)(嘶吼)(痉挛)(扭曲的行走)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(扭动)(走上岸)(扭曲的行走)(扭曲)(嘶吼)(嘶吼)(痉挛)(扭曲的行走)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(不分对象攻击)(扭动)(嘶吼)(爬行)(爬行)(不分对象攻击)(激烈地爬动)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(扭曲的行走)(激烈地爬动)(激烈地爬动)(阴暗的爬行)(扭动)(分裂)(扭曲)(激烈地爬动)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(扭曲的行走)(激烈地爬动)(激烈地爬动)(阴暗的爬行)(扭动)(分裂)(扭曲)(激烈地爬动)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(不分对象攻击)(扭动)(嘶吼)(爬行)(爬行)(不分对象攻击)(激烈地爬动)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(不分对象攻击)(扭动)(嘶吼)(爬行)(爬行)(不分对象攻击)(激烈地爬动)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(痉挛)(走上岸)(不分对象攻击)(尖叫)(阴暗地蠕动)(嘶吼)(尖叫)(扭曲的行走)(扭曲的行走)(分裂)(扭曲)(不分对象攻击)(尖叫)(尖叫)(阴暗的爬行)(走上岸)(翻滚)(激烈地爬动)(不分对象攻击)(走上岸)(翻滚)(扭动)(尖叫)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(翻滚)(痉挛)(爬行)(分裂)(扭曲)(走上岸)(走上岸)(嘶吼)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(痉挛)(走上岸)(不分对象攻击)(尖叫)(阴暗地蠕动)(嘶吼)(尖叫)(扭曲的行走)(扭曲的行走)(分裂)(扭曲)(不分对象攻击)(尖叫)(尖叫)(阴暗的爬行)(走上岸)(翻滚)(激烈地爬动)(不分对象攻击)(走上岸)(翻滚)(扭动)(尖叫)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(走上岸)(阴森的低吼)(痉挛)(爬行)(分裂)(尖叫)(不分对象攻击)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(蠕动)(扭曲)(扭曲)(分裂)(蠕动)(不分对象攻击)(扭曲的行走)(嘶吼)(翻滚)(痉挛)(不分对象攻击)(激烈地爬动)(扭动)(走上岸)(扭曲的行走)(扭曲)(嘶吼)(嘶吼)(痉挛)(扭曲的行走)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(不分对象攻击)(扭动)(嘶吼)(爬行)(爬行)(不分对象攻击)(激烈地爬动)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(痉挛)(走上岸)(不分对象攻击)(尖叫)(阴暗地蠕动)(嘶吼)(尖叫)(扭曲的行走)(扭曲的行走)(分裂)(扭曲)(不分对象攻击)(尖叫)(尖叫)(阴暗的爬行)(走上岸)(翻滚)(激烈地爬动)(不分对象攻击)(走上岸)(翻滚)(扭动)(尖叫)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(阴森的低吼)(扭曲的行走)(痉挛)(蠕动)(分裂)(蠕动)(翻滚)(爬行)(翻滚)(痉挛)(不分对象攻击)(激烈地爬动)(不分对象攻击)(扭动)(嘶吼)(爬行)(嘶吼)(嘶吼)(痉挛)(扭曲的行走)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(爬行)(阴暗的爬行)(阴暗的爬行)(扭曲的行走)(尖叫)(走上岸)(阴暗的爬行)(走上岸)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(翻滚)(痉挛)(爬行)(分裂)(扭曲)(走上岸)(走上岸)(嘶吼)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(蠕动)(扭曲)(扭曲)(分裂)(蠕动)(不分对象攻击)(扭曲的行走)(嘶吼)(翻滚)(痉挛)(不分对象攻击)(激烈地爬动)(扭动)(走上岸)(扭曲的行走)(扭曲)(嘶吼)(嘶吼)(痉挛)(扭曲的行走)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(阴暗地蠕动)(嘶吼)(尖叫)(扭曲的行走)(阴暗的爬行)(不分对象攻击)(扭曲)(痉挛)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(扭曲的行走)(激烈地爬动)(激烈地爬动)(阴暗的爬行)(嘶吼)(嘶吼)(痉挛)(扭曲的行走)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(爬行)(阴暗的爬行)(阴暗的爬行)(扭曲的行走)(尖叫)(走上岸)(阴暗的爬行)(走上岸)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(扭动)(扭曲的行走)(翻滚)(分裂)(蠕动)(扭曲)(扭曲)(分裂)(分裂)(嘶吼)(蠕动)(蠕动)(激烈地爬动)(嘶吼)(蠕动)(痉挛)(阴暗地蠕动)(尖叫)(阴森的低吼)(爬行)(分裂)(尖叫)(不分对象攻击)(阴暗的爬行)(分裂)(扭曲的行走)(激烈地爬动)(扭曲)(走上岸)(痉挛)(激烈地爬动)(翻滚)

    Visit original content creator repository
    https://github.com/SherkeyXD/haisi-encoding

  • raku-meta6-bin

    META6::bin

    Build Status

    Create and check META6.json files and module skeletons.

    Depends on git and curl in $PATH and got a timeout of 60s for each call to both. Those are used to setup a git and github repo.

    Module skeletons include basic directories, META6.json, t/meta.t, .travis.yml and a README.md. The latter includes a link to travis-ci.

    SYNOPSIS

    meta6 --create --name=<project-name-here> --force
    meta6 --check
    meta6 --create-cfg-dir --force
    meta6 --new-module=<Module::Name::Here> --force --skip-git --skip-github
    meta6 --fork-module=<Module::Name::Here>
    meta6 --add-dep=<Module::Name::Here:ver<1.2.3>>
    meta6 --pull-request
    meta6 --issues --module=<Optional::Module::Name> --closed --one-line --url --deps --verbose
    meta6 --set-license="license name or URL"
    meta6 --add-author="Another T. Author <another.t.author@somewhere.place>"
    meta6 --release --version=1.2.3
    

    Use as a Module

    use v6.c;
    
    use META6::bin :HELPER;
    
    &META6::bin::try-to-fetch-url.wrap({
        say "checking URL: ⟨$_⟩";
        callsame;
    });
    
    META6::bin::MAIN(:check);
    

    General Options

    --meta6-file=<path-to-META6.json> # defaults to ./META6.json
    

    Create Options

    --name
    --description
    --version # defaults to 0.0.1
    --perl # defaults to 6.c
    --author # defaults to user/name from ~/.gitconfig
    --auth # defaults to credentials/username from ~/.gitconfig
    

    New Module Options

    --new-module=<Module::Name::Here>
    --description="some text" # added both META6.json and README.md
    --base-dir # the $*CWD for all local file operations
    

    Will create a new module project in a new directory with a name prefixed with create.prefix (default raku-), setup git, push it to github (See Github below). The skeleton from the config dir ~/.meta6 will be applied (see Config Dir below).

    Fork Module Options

    --fork-module=<Module::Name::Here> # module name as to be found in the ecosystem
    

    This will seach a module by name in the ecosystem. If it’s a github repo that repo will be forked and cloned to the local FS. If there is a META6.info but no t/meta.t, the file and its dependancy will be added and commited to the local git repo.

    Pull Request Options

    --pull-request
    --title=`git log|head 1` # defaults to last commit message
    --message=''
    --head=master # branch in your fork
    --base=master # branch in upstream repo
    --repo-name # defaults to repo name provided in META6.info
    

    Pull request need to tell github where to create the PR at. That in turn requires a proper META6.json to get the repo name from.

    Releasing a module

    To create a release on github use --release. The optional parameter --version takes a string that is used as a version and stored in the META6.json-file. Versions can be incremented with +, ++, +++ for the parts of a version with the form 1.2.3. A single + will change the revision, ++ the miner version and +++ the major.

    A github-tag will be created and is the base of the release. The source-url field in the META6.json is set to the tarball of the release on github.

    Config Dir

    The config dir resides at ~/.meta6 and holds a folder called skeleton for additional files to be copied into any new project. This is where you put your default LICENSE or alternate .gitignore.

    The config dir, a default meta6.cfg and its default subdirs are created with --create-cfg-dir.

    Any executable under pre-create.d, post-create.d and post-push.d are sorted and executed with a timeout of 60 seconds each. Files that end in ~ are filtered out.

    The config directory can hold a github-token.txt file that is used to help curl to connect to github. The token needs the scopes repo, user/read:user and user/email. Please note that git itself can handle a ~/.netrc-file and github will accept a token instead of a password.

    Github

    To be able to talk to github your git-config requires a section as follows.

    [credential]
        username = your-github-username
    
    Visit original content creator repository https://github.com/gfldex/raku-meta6-bin
  • spoj-problems-python

    SPOJ Problems Solution in PYTHON

    About SPOJ

    SPOJ (Sphere Online Judge) is an online judge system with over 640,000 registered users and over 20,000 problems. Tasks are prepared by its community of problem setters or are taken from previous programming contests. SPOJ allows advanced users to organize contests under their own rules and also includes a forum where programmers can discuss how to solve a particular problem.

    Apart from the English language, SPOJ also offers its content in Polish, Portuguese and Vietnamese languages. The solution to problems can be submitted in over 40 programming languages, including esoteric ones, via the Sphere Engine. It is run by the Polish company Sphere Research Labs.

    The website is considered both an automated evaluator of user-submitted programs as well as an online learning platform to help people understand and solve computational tasks. It also allows students to compare paradigms and approaches with a wide variety of languages.

    What we are trying to do

    We will provide you with the solutions in Python. You can use it as reference whenever you feel like you are stuck.
    All the solutions are in separate folder. The name of the folder is exactly the same as the name of the problem. Also, folder name consist of a number enclosed in []. It tells the
    ID number of the problem on SPOJ Website.

    Visit original content creator repository
    https://github.com/snifhex/spoj-problems-python

  • orx-priority-queue

    orx-priority-queue

    orx-priority-queue crate orx-priority-queue crate orx-priority-queue documentation

    Priority queue traits and high performance d-ary heap implementations.

    no-std: This crate supports no-std; however, std is added as a default feature. Please include with no-default-features for no-std use cases: cargo add orx-priority-queue --no-default-features.

    A. Priority Queue Traits

    This crate aims to provide algorithms with the abstraction over priority queues. In order to achieve this, two traits are defined: PriorityQueue<N, K> and PriorityQueueDecKey<N, K>. The prior is a simple queue while the latter extends it by providing additional methods to change priorities of the items that already exist in the queue.

    The separation is important since additional operations often requires the implementors to allocate internal memory for bookkeeping. Therefore, we would prefer PriorityQueueDecKey<N, K> only when we need to change the priorities.

    See DecreaseKey section for a discussion on when decrease-key operations are required and why they are important.

    B. d-ary Heap Implementations

    d-ary implementations are generalizations of the binary heap; i.e., binary heap is a special case where D=2. It is advantageous to have a parametrized d; as for instance, in the benchmarks defined here, D=4 outperforms D=2.

    • With a large d: number of per level comparisons increases while the tree depth becomes smaller.
    • With a small d: each level requires fewer comparisons while the tree with the same number of nodes is deeper.

    Further, three categories of d-ary heap implementations are introduced.

    1. DaryHeap (PriorityQueue)

    This is the basic d-ary heap implementing PriorityQueue. It is the default choice unless priority updates or decrease-key operations are required.

    2. DaryHeapOfIndices (PriorityQueue + PriorityQueueDecKey)

    This is a d-ary heap paired up with a positions array and implements PriorityQueueDecKey.

    • It requires the nodes to implement HasIndex trait which is nothing but fn index(&self) -> usize. Note that usize, u64, etc., already implements HasIndex.
    • Further, it requires to know the maximum index that is expected to enter the queue. In other words, candidates are expected to come from a closed set.

    Once these conditions are satisfied, it performs significantly faster than the alternative decrease key queues.

    Although the closed set requirement might sound strong, it is often naturally satisfied in mathematical algorithms. For instance, for most network traversal algorithms, the candidates set is the nodes of the graph, or indices in 0..num_nodes. Similarly, if the heap is used to be used for sorting elements of a list, indices are simply coming from 0..list_len.

    This is the default decrease-key queue provided that the requirements are satisfied.

    3. DaryHeapWithMap (PriorityQueue + PriorityQueueDecKey)

    This is a d-ary heap paired up with a positions map (HashMap or BTreeMap when no-std) and also implements PriorityQueueDecKey.

    This is the most general decrease-key queue that provides the open-set flexibility and fits to almost all cases.

    Other Queues

    In addition, queue implementations are provided in this crate for the following external data structures:

    • std::collections::BinaryHeap<(N, K)> implements only PriorityQueue<N, K>,
    • priority_queue:PriorityQueue<N, K> implements both PriorityQueue<N, K> and PriorityQueueDecKey<N, K>
      • requires --features impl_priority_queue
      • or --features impl_all

    This allows to use all the queue implementations interchangeably and pick the one fitting best to the use case.

    Performance & Benchmarks

    You may find the details of the benchmarks at benches folder.

    http://intelwell.top/wp-content/uploads/2025/08/bench_results.PNG

    The table above summarizes the benchmark results of basic operations on basic queues, and queues allowing decrease key operations.

    • In the first benchmark, we repeatedly call push and pop operations on a queue while maintaining an average length of 100000:
      • We observe that BinaryHeap (DaryHeap<_, _, 2>) performs almost the same as the standard binary heap.
      • Experiments on different values of d shows that QuaternaryHeap (D=4) outperforms both binary heaps.
      • Further increasing D to 8 does not improve performance.
      • Finally, we repeat the experiments with BinaryHeap and QuaternaryHeap using the specialized push_then_pop operation. Note that this operation further doubles the performance, and hence, should be used whenever it fits the use case.
    • In the second benchmark, we add decrease_key_or_push calls to the operations. Standard binary heap is excluded since it cannot implement PriorityQueueDecKey.
      • We observe that DaryHeapOfIndices significantly outperforms other decrease key queues.
      • Among BinaryHeapOfIndices and QuaternaryHeapOfIndices, the latter with D=4 again performs better.

    C. Examples

    C.1. Basic Usage

    Below example demonstrates basic usage of a simple PriorityQueue. You may see the entire functionalities here.

    use orx_priority_queue::*;
    
    // generic over simple priority queues
    fn test_priority_queue<P>(mut pq: P)
    where
        P: PriorityQueue<usize, f64>,
    {
        pq.clear();
    
        pq.push(0, 42.0);
        assert_eq!(Some(&0), pq.peek().map(|x| x.node()));
        assert_eq!(Some(&42.0), pq.peek().map(|x| x.key()));
    
        let popped = pq.pop();
        assert_eq!(Some((0, 42.0)), popped);
        assert!(pq.is_empty());
    
        pq.push(0, 42.0);
        pq.push(1, 7.0);
        pq.push(2, 24.0);
        pq.push(10, 3.0);
    
        while let Some(popped) = pq.pop() {
            println!("pop {:?}", popped);
        }
    }
    
    // d-ary heap generic over const d
    const D: usize = 4;
    
    test_priority_queue(DaryHeap::<usize, f64, D>::default());
    test_priority_queue(DaryHeapWithMap::<usize, f64, D>::default());
    test_priority_queue(DaryHeapOfIndices::<usize, f64, D>::with_index_bound(100));
    
    // type aliases for common heaps: Binary or Quaternary
    test_priority_queue(BinaryHeap::default());
    test_priority_queue(QuaternaryHeapWithMap::default());
    test_priority_queue(BinaryHeapOfIndices::with_index_bound(100));

    As mentioned, PriorityQueueDecKey extends capabilities of a PriorityQueue. You may see the additional functionalities here.

    use orx_priority_queue::*;
    
    // generic over decrease-key priority queues
    fn test_priority_queue_deckey<P>(mut pq: P)
    where
        P: PriorityQueueDecKey<usize, f64>,
    {
        pq.clear();
    
        pq.push(0, 42.0);
        assert_eq!(Some(&0), pq.peek().map(|x| x.node()));
        assert_eq!(Some(&42.0), pq.peek().map(|x| x.key()));
    
        let popped = pq.pop();
        assert_eq!(Some((0, 42.0)), popped);
        assert!(pq.is_empty());
    
        pq.push(0, 42.0);
        assert!(pq.contains(&0));
    
        pq.decrease_key(&0, 7.0);
        assert_eq!(Some(&0), pq.peek().map(|x| x.node()));
        assert_eq!(Some(&7.0), pq.peek().map(|x| x.key()));
    
        let deckey_result = pq.try_decrease_key(&0, 10.0);
        assert!(matches!(ResTryDecreaseKey::Unchanged, deckey_result));
        assert_eq!(Some(&0), pq.peek().map(|x| x.node()));
        assert_eq!(Some(&7.0), pq.peek().map(|x| x.key()));
    
        while let Some(popped) = pq.pop() {
            println!("pop {:?}", popped);
        }
    }
    
    // d-ary heap generic over const d
    const D: usize = 4;
    
    test_priority_queue_deckey(DaryHeapOfIndices::<usize, f64, D>::with_index_bound(100));
    test_priority_queue_deckey(DaryHeapWithMap::<usize, f64, D>::default());
    
    // type aliases for common heaps: Binary or Quaternary
    test_priority_queue_deckey(BinaryHeapOfIndices::with_index_bound(100));
    test_priority_queue_deckey(QuaternaryHeapWithMap::default());

    C.2. Usage in Dijkstra’s Shortest Path

    You may see below two implementations of the Dijkstra’s shortest path algorithm: one using a PriorityQueue and the other with a PriorityQueueDecKey. Please note the following:

    • Priority queue traits allow us to be generic over queues. Therefore, we are able to implement the algorithm once that works for any queue implementation.
    • The second implementation with a decrease key queue pushes some of the bookkeeping to the queue, and arguably leads to a cleaner algorithm implementation.
    use orx_priority_queue::*;
    
    pub struct Edge {
        head: usize,
        weight: u32,
    }
    
    pub struct Graph(Vec<Vec<Edge>>);
    
    impl Graph {
        fn num_nodes(&self) -> usize {
            self.0.len()
        }
    
        fn out_edges(&self, node: usize) -> impl Iterator<Item = &Edge> {
            self.0[node].iter()
        }
    }
    
    // Implementation using a PriorityQueue
    
    fn dijkstras_with_basic_pq<Q: PriorityQueue<usize, u32>>(
        graph: &Graph,
        queue: &mut Q,
        source: usize,
        sink: usize,
    ) -> Option<u32> {
        // init
        queue.clear();
        let mut dist = vec![u32::MAX; graph.num_nodes()];
        dist[source] = 0;
        queue.push(source, 0);
    
        // iterate
        while let Some((node, cost)) = queue.pop() {
            if node == sink {
                return Some(cost);
            } else if cost > dist[node] {
                continue;
            }
    
            let out_edges = graph.out_edges(node);
            for Edge { head, weight } in out_edges {
                let next_cost = cost + weight;
                if next_cost < dist[*head] {
                    queue.push(*head, next_cost);
                    dist[*head] = next_cost;
                }
            }
        }
    
        None
    }
    
    // Implementation using a PriorityQueueDecKey
    
    fn dijkstras_with_deckey_pq<Q: PriorityQueueDecKey<usize, u32>>(
        graph: &Graph,
        queue: &mut Q,
        source: usize,
        sink: usize,
    ) -> Option<u32> {
        // init
        queue.clear();
        let mut visited = vec![false; graph.num_nodes()];
    
        // init
        visited[source] = true;
        queue.push(source, 0);
    
        // iterate
        while let Some((node, cost)) = queue.pop() {
            if node == sink {
                return Some(cost);
            }
    
            let out_edges = graph.out_edges(node);
            for Edge { head, weight } in out_edges {
                if !visited[*head] {
                    queue.try_decrease_key_or_push(&head, cost + weight);
                }
            }
            visited[node] = true;
        }
    
        None
    }
    
    // example input
    
    let e = |head: usize, weight: u32| Edge { head, weight };
    let graph = Graph(vec![
        vec![e(1, 4), e(2, 5)],
        vec![e(0, 3), e(2, 6), e(3, 1)],
        vec![e(1, 3), e(3, 9)],
        vec![],
    ]);
    
    // TESTS: basic priority queues
    
    let mut pq = BinaryHeap::new();
    assert_eq!(Some(5), dijkstras_with_basic_pq(&graph, &mut pq, 0, 3));
    assert_eq!(None, dijkstras_with_basic_pq(&graph, &mut pq, 3, 1));
    
    let mut pq = QuaternaryHeap::new();
    assert_eq!(Some(5), dijkstras_with_basic_pq(&graph, &mut pq, 0, 3));
    assert_eq!(None, dijkstras_with_basic_pq(&graph, &mut pq, 3, 1));
    
    let mut pq = DaryHeap::<_, _, 8>::new();
    assert_eq!(Some(5), dijkstras_with_basic_pq(&graph, &mut pq, 0, 3));
    assert_eq!(None, dijkstras_with_basic_pq(&graph, &mut pq, 3, 1));
    
    // TESTS: decrease key priority queues
    
    let mut pq = BinaryHeapOfIndices::with_index_bound(graph.num_nodes());
    assert_eq!(Some(5), dijkstras_with_deckey_pq(&graph, &mut pq, 0, 3));
    assert_eq!(None, dijkstras_with_deckey_pq(&graph, &mut pq, 3, 1));
    
    let mut pq = DaryHeapOfIndices::<_, _, 8>::with_index_bound(graph.num_nodes());
    assert_eq!(Some(5), dijkstras_with_deckey_pq(&graph, &mut pq, 0, 3));
    assert_eq!(None, dijkstras_with_deckey_pq(&graph, &mut pq, 3, 1));
    
    let mut pq = BinaryHeapWithMap::new();
    assert_eq!(Some(5), dijkstras_with_deckey_pq(&graph, &mut pq, 0, 3));
    assert_eq!(None, dijkstras_with_deckey_pq(&graph, &mut pq, 3, 1));

    Contributing

    Contributions are welcome! If you notice an error, have a question or think something could be improved, please open an issue or create a PR.

    License

    Dual-licensed under Apache 2.0 or MIT.

    Visit original content creator repository https://github.com/orxfun/orx-priority-queue
  • react-native-smartbar

    Visit original content creator repository
    https://github.com/React-Native-Exercises/react-native-smartbar