Blog

  • ledger-stellar

    Ledger Stellar App

    Compilation & tests Swap function tests


    NOTE

    This repository is now archived because it has been merged into LedgerHQ/app-stellar.


    Introduction

    This is the wallet app for the Ledger Nano S, Ledger Nano S Plus and Ledger Nano X that makes it possible to store Stellar-based assets on those devices and generally sign any transaction for the Stellar network.

    Documentation

    This app follows the specification available in the ./docs folder.

    SDK

    You can communicate with the app through the following libraries:

    Building and installing

    If not for development purposes, you should install this app via Ledger Live.

    To build and install the app on your Nano S or Nano S Plus you must set up the Ledger build environments. Please follow the load the application instructions at the Ledger developer portal.

    Additionaly, install this dependency:

    sudo apt install libbsd-dev

    The command to compile and load the app onto the device is:

    make load

    To remove the app from the device do:

    make delete

    Testing

    This project provides unit tests, integration tests and end-to-end tests, unit tests are located under the ./tests_unit folder, and the integration tests and end-to-end tests are located under the ./tests_zemu folder.

    During development, we recommend that you run the unit test first, as it takes less time to run, and then run the other tests after the unit test has run successfully.

    Unit testing

    The ./tests_unit directory contains files for testing the utils, the xdr transaction parser, the screen formatter and the swap function.

    They require the Node.js, cmocka unit testing framework, CMake and libbsd to be installed:

    sudo apt install libcmocka-dev cmake libbsd-dev

    It is recommended to use nvm to install the latest LTS version of Node.js

    To build and execute the tests, run the following command:

    make tests-unit

    Integration testing and end-to-end testing

    Testing is done via the open-source framework zemu.

    In order to run these tests, you need to install Docker in addition to the dependencies mentioned in Unit testing.

    To build and execute the tests, run the following commands:

    make tests-zemu

    To run a specific test first, please run the following commands:

    cd tests_zemu
    npm run test -- -t "{testCaseName}"
    Visit original content creator repository https://github.com/overcat/ledger-stellar
  • laravel-react

    Build Status Total Downloads Latest Stable Version License

    About Laravel

    Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:

    Laravel is accessible, powerful, and provides tools required for large, robust applications.

    Learning Laravel

    Laravel has the most extensive and thorough documentation and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.

    If you don’t feel like reading, Laracasts can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.

    Laravel Sponsors

    We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel Patreon page.

    Premium Partners

    Contributing

    Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the Laravel documentation.

    Code of Conduct

    In order to ensure that the Laravel community is welcoming to all, please review and abide by the Code of Conduct.

    Security Vulnerabilities

    If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via taylor@laravel.com. All security vulnerabilities will be promptly addressed.

    License

    The Laravel framework is open-sourced software licensed under the MIT license.

    Visit original content creator repository https://github.com/RizkyZaki/laravel-react
  • dark-mode-toggle

    Dark mode Toggle

    This project is a simple implementation of a dark mode toggle switch for a webpage. When the switch is toggled on, the background color of the webpage changes to a dark theme, and the switch circle changes color as well. The implementation is done using HTML, CSS, and JavaScript. The HTML contains the switch input element and label, while the CSS is used to style the switch elements and animate the switch circle. The JavaScript code handles the functionality of the switch, updating the webpage’s background color and storing the user’s preference using local storage. The result is a basic but effective way to add a dark mode toggle feature to a webpage.

    Demo

    You can try out the application by visiting this link.

    Technologies Used

    • HTML
    • CSS
    • JavaScript

    Getting Started

    To get started with this project, clone the repository and open the index.html file in your preferred web browser.

    New Things I Learned

    1. I learned about localStorage, which is a built-in web API that allows web developers to store data on a user’s local machine. It provides a simple way to save data locally and retrieve it later.
    2. JSON.stringify(): I also learned about the JSON.stringify() method, which is a built-in JavaScript method that is used to convert a JavaScript object into a JSON string. JSON stands for JavaScript Object Notation and is a lightweight format for storing and transporting data.
    3. localStorage.setItem(): Another thing I learned was the localStorage.setItem() method, which is used to store a key-value pair in the browser’s local storage. The setItem() method takes two arguments: the name of the key and the value you want to store.
    4. localStorage.getItem(): I learned about the localStorage.getItem() method, which is used to retrieve a value stored in the browser’s local storage. The getItem() method takes the name of the key as an argument and returns the corresponding value.
    5. JSON.parse(): I also learned about the JSON.parse() method, which is a built-in JavaScript method that is used to convert a JSON string back into a JavaScript object. This method is the opposite of JSON.stringify().

    Overall, I learned about how to use localStorage to store and retrieve data on a user’s local machine, as well as how to use JSON.stringify() and JSON.parse() to convert data between a JavaScript object and a JSON string. These skills can be useful for building web applications that need to store and retrieve user preferences or other data on the user’s device.

    Challenges I faced

    I’ve had some difficulty understanding some of the JavaScript methods used in the code of this project. Specifically, I had trouble understanding localStorage.setItem(), localStorage.getItem(), and JSON.parse(), and how to use them in the context of the project.

    Untitled video - Made with Clipchamp (3)

    Visit original content creator repository https://github.com/paribhandarkar/dark-mode-toggle
  • ShiftSER

    Temporal Shift for Speech Emotion Recognition [arXiv]

    Code for ICASSP 2023 paper “Mingling or Misalignment? Temporal Shift for Speech Emotion Recognition with Pre-trained Representations”.

    Shift

    Libraries and Dependencies

    Data Preparation

    Download our preprocessed wavfeature_7.5.tar.gz directly and unzip it to /dataset/IEMOCAP directory.

    Or obtain IEMOCAP from USC and run

    cd dataset/IEMOCAP
    python Preprocess.py --path $path to directory of IEMOCAP$
    cd ../..
    

    Then you have wavfeature_7.5.pkl and each processed audio is clipped to 7.5s and samped at 16kHz.

    Training

    We train the model specified in our paper with the same placement/proportion of shift. It should be noted that the placement/proportion of shift and other hyperparameters (see config.py) can be adjusted flexibly.

    Key arguments for easy config modification in main.py are as follows,

    • --model: the model chosen for training.
      • cnn: convnext-like 1D CNN with 2 blocks.
      • rnn: 1 layer bidirectioanl LSTM.
      • transformer: 2-block Transformer with relative positional embedding by default.
    • --shift: whether to use temporal shift. The placement of shift are hard-coding as described in our paper: residual shift for CNN, replacement of MHSA for Transformer and in-place shift for lstm. We provide optional placement in annotation.
    • --ndiv: proportion of shift, namely 1/ndiv of channels will be shifted while others reamain unchanged.
    • --stride: the step to be shifted, kept as 1 by default.
    • --bidirectional: whether to use bidirectional temporal shift.
    • --finetune: whether to finetune the pretrained model or take the pretrained model as feature extractor. By default, we use wav2vec2 for finetuning and HuBERT for feature extraction.

    For CNN and ShiftCNN

    # Feture extraction for basic convnext
    python main.py --model cnn
    # Finetuning for basic convnext
    python main.py --model cnn --finetune
    # Feture extraction for ShiftCNN
    python main.py --model cnn --shift --ndiv 16
    # Finetuning for ShiftCNN
    python main.py --model cnn --shift --ndiv 16 --finetune

    For Transformer and Shiftformer

    # Feture extraction for transformer
    python main.py --model transformer
    # Finetuning for transformer
    python main.py --model transformer --finetune
    # Feture extraction for Shiftformer
    python main.py --model transformer --shift --ndiv 4 --bidirectional
    # Finetuning for Shiftformer
    python main.py --model transformer --shift --ndiv 4 --bidirectional --finetune

    For LSTM and ShiftLSTM

    # Feture extraction for lstm
    python main.py --model rnn
    # Finetuning for lstm
    python main.py --model rnn --finetune
    # Feture extraction for Shiftlstm
    python main.py --model rnn --shift --ndiv 4
    # Finetuning for Shiftlstm
    python main.py --model rnn --shift --ndiv 4 --finetune

    The fianl results of 5 fold is expected to be in /log.

    Citation

    @inproceedings{shen2023mingling,
      title={Mingling or misalignment? temporal shift for speech emotion recognition with pre-trained representations},
      author={Shen, Siyuan and Liu, Feng and Zhou, Aimin},
      booktitle={ICASSP 2023-2023 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP)},
      pages={1--5},
      year={2023},
      organization={IEEE}
    }
    Visit original content creator repository https://github.com/ECNU-Cross-Innovation-Lab/ShiftSER
  • spreadsheet

    Spreadsheet

    TypeScript/javascript spreadsheet parser, with formulas. For a full list of formulas, see DOCS.md.

    Usage

    Install

    npm install js-spreadsheet
    

    Examples

    Using a Sheet

    var Sheet = require("js-spreadsheet").Sheet;
    var sheet = new Sheet();
    sheet.setCell("A1", "10");
    sheet.setCell("A2", "14");
    sheet.setCell("A4", "10e2");
    sheet.setCell("A5", "99.1");
    sheet.setCell("B1", "=SUM(A1:A5)");
    sheet.getCell("B1").getValue(); // returns: 1123.1

    Using Formulas Directly

    var Formulas = require("js-spreadsheet").AllFormulas;
    Formulas.SUM(1, 2, 3, [4, 5, 6], "7"); // returns: 28

    For a full list of formulas, see DOCS.md

    Nested Formulas

    sheet.setCell('A1', '=SIN(PI() / 2)')
    sheet.getCell("A1").getValue(); // returns: 1

    Date Conversion

    sheet.setCell('A1', '=DATEDIF("1992-6-19", "1996-6-19", "Y")')
    sheet.getCell("A1").getValue(); // returns: 4

    Number Parsing

    sheet.setCell('A1', '="10e1" + 44');
    sheet.getCell("A1").getValue(); // returns: 144
    
    sheet.setCell('A2', '="1,000,000" + 1');
    sheet.getCell("A2").getValue(); // returns: 1000001
    
    sheet.setCell('A3', '="-$10.00" + 0');
    sheet.getCell("A3").getValue(); // returns: -10
    
    sheet.setCell('A4', '=10% + 1');
    sheet.getCell("A4").getValue(); // returns: 1.1
    
    sheet.setCell('A5', '= 2 ^ 10');
    sheet.getCell("A5").getValue(); // returns: 1024

    Ranges

    In MS Excel, and Google Spreadsheets, literal ranges are denoted with opening and closing curly-brackets. E.g. “{1, 2, 3}”. In this implementation however, literal ranges are denoted with opening and closing brackets. E.g. “[1, 2, 3]”.

    // OK
    sheet.setCell('A1', '=SUM([1, 2, 3])');
    // NOT OK
    sheet.setCell('A1', '=SUM({1, 2, 3})');

    Docs

    See DOCS.md for full list and documentation of all formulas available.

    Contributing

    When adding a formula, or fixing a bug please follow the commit message format:

    [BUG_FEATURE_FILE_OR_COMPONENT] short description here of issue and fix
    

    If you’re adding a new formula, before you submit a pull request or push ensure that:

    1. The formula is tested inside the proper category file in tests/Formulas.
    2. Make sure the formula is exported, and imported/exported in AllFormulas.ts.
    3. The formula tests for reference errors, N/A errors, value errors for each input.
    4. That the formula is tested for parsing inside SheetFormulaTest.ts.
    5. Run tests with npm run test.
    6. Build with npm run build.
    7. Build DOCS.md with npm run docs.

    Why?

    Near the end of 2016 I began to ask myself why I didn’t know more about MS Excel and Google Spreadsheets. Why didn’t I know more about the most popular programing language in the world? I began to reverse engineer Google Spreadsheets in particular, gaining a better understanding along the way.

    I chose TypeScript because, coming from Java, it is really nice to be able to see type errors, and catch them. I also just enjoy getting specific with my return types, even if the specifications for a spreadsheet treat type flexibly.

    For the formula documentation, I tried to be at least — if not more — thorough as Google Spreadsheets.

    License

    For this repository’s code license, and related licenses, see LICENSES directory.

    Acknowledgements

    This is largely a re-write of Handsontable‘s https://github.com/handsontable/ruleJS, and https://github.com/sutoiku/formula.js/. The parser was derived from Handsontable’s, and many of the formulas were created with FormulaJS’s formulas as a reference point.

    Visit original content creator repository
    https://github.com/vogtb/spreadsheet

  • Standards

    GitHub release Carthage compatible CocoaPods Swift GitHub license Gitmoji HelpWanted

    Standards

    Standards was created to enable iOS, tvOS, watchOS and macOS developers that need to support legacy systems (pre iOS 10.0, pre tvOS 10.0, pre watchOS 3.0 and pre macOS 10.12) to use the Measurement API that’s included in these systems’s Foundation.

    Compatibility

    • iOS 8.0
    • tvOS 9.0
    • watchOS 2.0
    • macOS 10.10

    Features

    Compared to Measurement, Standards has the following features:

    • Creating and Converting Standards (e.g. kilometers to miles)
    • Calculate with Standards (Operators +, -, *, /)
    • Compare Standards
    • Measurement Formatting

    Compared to Measurement, Standards supports the following Units:

    Remarks

    Standards is designed to be API-compatible with Foundation on the call site. So you can just use it like you would use Measurement, with one exception:

    For compatibility reasons with iOS 10.0+, tvOS 10.0+, watchOS 3.0+ and macOS 10.12+ it’s impractical to actually call the class Measurement (b/c you then would always have to namespace it). So just replace Measurement with Standard.

    Basic Usage

    let distance = Standard(value: 106.4, unit: UnitLength.kilometers)
    // → 106.4 km
    
    let distanceInMeters = distance.converted(to: .meters)
    // → 106400 m
    let distanceInMiles = distance.converted(to: .miles)
    // → 66.1140591795394 mi
    let distanceInFurlongs = distance.converted(to: .furlongs)
    // → 528.911158832419 fur 

    Installation

    As for now, you can use Carthage or CocoaPods to install Standards using a dependency manager or do it manually.

    Carthage

    To integrate Standards into your Xcode project using Carthage, specify it in your Cartfile:

    github "floriankrueger/Standards"
    

    CocoaPods

    Make sure your Podfile contains all of the following lines.

    use_frameworks!
    platform :ios, '8.0'
     
    pod 'Standards'

    Then run pod install.

    Manually

    To do it ‘by hand’ take the following files and add them to your project:

    • Sources/Standard.swift
    • Sources/Unit/BasedDimension.swift
    • Sources/Unit/Dimension.swift
    • Sources/Unit/Unit.swift
    • Sources/Conversion/UnitConverter.swift
    • Sources/Conversion/UnitConverterLinear.swift

    And any of the Units that you need:

    • Sources/Unit/UnitLength.swift
    • Sources/Unit/UnitArea.swift
    • Sources/Unit/UnitSpeed.swift
    • Sources/Unit/UnitTemperature.swift

    Contributors

    Thanks for contributing to this project!

    License

    Standards is released under the MIT License.

    Visit original content creator repository https://github.com/floriankrueger/Standards
  • cgp-cnn

    Designing Convolutional Neural Network Architectures Based on Cartegian Genetic Programming

    This repository contains the code for the following paper:

    Masanori Suganuma, Shinichi Shirakawa, and Tomoharu Nagao, “A Genetic Programming Approach to Designing Convolutional Neural Network Architectures,”
    Proceedings of the Genetic and Evolutionary Computation Conference (GECCO ’17), pp. 497-504 (2017) [DOI] [arXiv]

    Requirement

    We use the Chainer framework for neural networks and tested on the following environment:

    • Chainer version 1.16.0
    • GPU: GTX 1080 or 1070
    • Python version 3.5.2 (anaconda3-4.1.1)

    PyTorch version is here

    Usage

    Run the architecture search

    This code can reproduce the experiment for CIFAR-10 dataset with the same setting of the GECCO 2017 paper (by default scenario). The (training) data are split into the training and validation data. The validation data are used for assigning the fitness to the generated architectures. We use the maximum validation accuracy in the last 10 epochs as the fitness value.

    If you run with the ResSet described in the paper as the function set:

    python exp_main.py -f ResSet

    Or if you run with the ConvSet described in the paper:

    python exp_main.py -f ConvSet

    When you use the multiple GPUs, please specify the -g option:

    python exp_main.py -f ConvSet -g 2

    After the execution, the files, network_info.pickle and log_cgp.txt will be generated. The file network_info.pickle contains the information for Cartegian genetic programming (CGP) and log_cgp.txt contains the log of the optimization and discovered CNN architecture’s genotype lists.

    Some parameters (e.g., # rows and columns of CGP, and # epochs) can easily change by modifying the arguments in the script exp_main.py.

    Re-training

    The discovered architecture is re-trained by the different training scheme (500 epoch training with momentum SGD) to polish up the network parameters. All training data are used for re-training, and the accuracy for the test data set is reported.

    python exp_main.py -m retrain

    Visit original content creator repository
    https://github.com/sg-nm/cgp-cnn

  • groupie

    Groupie — Using Email to Tack On to Groups

    Groupie is een software service that enables groups to administer their
    members, on which ARPA2 applications can continue to build their
    collaborative structures. Groupie administers things over email, using
    the fact that the majority of email is signed by DKIM.

    Groupie allows users to setup groups under their domain, and invite members
    into their groups. Members can address services for subscribing to a group.
    Only when the group owner and the member agree will the membership be a fact.

    Context: InternetWide phase 2, IdentityHub

    Groupie is part of the
    second phase,
    InternetWide Architecture
    and more specifically the
    identity structures
    involving such things as
    users and groups
    and always with the intention to support you to
    Bring Your Own IDentity
    anywhere you go online.

    Specifically, the design of the InternetWide Architecture involves storage
    of information in an LDAP repository, which is centrally available and which
    can be easily distributed to other players, would the need arise. This is
    the
    Service Directory
    that is a vital part in the backend of this hosting infrastructure.

    Juggling Group Identities as in ARPA2 Projects

    ARPA2 defines users as well as groups, but that is not everything; it allows
    a great number of controls over light-weight aliases, and uses that heavily
    in protection of the privacy of users.

    Please understand that nothing about ARPA2 is closed or secretive;
    in fact, we are hoping to inspire many Internet service projects to integrate
    their use of identity with the system we are building to achieve better
    personal control over our online identity and, most importantly, better
    integration between tools.

    Even in a group, the user does not have to surrender their userid or even
    their (remote) email address. Group members have a membership name which
    is represented as a refinement of the group name, pretty much just like
    the aliases. The idea is that group members can address each other by
    referring not to the group, but by adding member names to it. This is
    simpler than it seems; communication in the group will come From: a
    particular group member, thereby revealing their group identity. All
    ARPA2 systems can work with this, and only the group-support software is
    really involved in mapping between those group member names and real local
    aliases and/or remote email addresses.

    So, imagine john@example.com signing up for youcancook@example.com, so
    locally. John picks an alias, youcancook+charcoalman@example.com for
    his membership to the list (or he might leave it to the limited fantasy
    of Groupie, which usually means that he ends up with 043510-04363 or
    something similarly appealing.

    When communicating on the list, John always has a choice or replying to
    a sender or to all on the list. In addition, there is some syntaxis
    that allows sending to the list plus selected dormant members, or minus
    a member whose birthday surpirse needs to be discussed. Often, there
    will be a group member named record which stores everything that
    passes for future reference. Sometimes, an dormant group member nsa
    (short for Non-Subscriber-Archive) may be added in to make an exchange
    available publicly. All this ends up in addresses with local parts
    like youcancook+mary for just Mary, youcancook for the entire group
    of non-dormant members, and youcancook+-+record for off-the-record
    talk.

    Mary, by the way, may be a remote member. The member name mary in
    youcancook+mary does not show that; a good example of how the member
    names help to protect privacy of group members. WHo’s who is however
    known to the group owner, who might need it to tackle abuse.

    Mechanics from LMTP to LDAP

    Requests arrive with Groupie over an LMTP port. This is a customary backend
    to which MTAs can send email. Such email will have a human sender, and it
    will be delivered to an identity known to Groupie. These identities look
    something like +group+subscribe+piecrusts@baking.fun — in other
    words, an email address under a domain, with a few words in the local part.

    After splitting the words by their + separators, they look like commands.
    Groupie will ignore the first word, which is the service name that it got
    from the MTA administrator, but after that has served the purpose of routing
    email to Groupie’s LMTP port that is no longer of interest. The rest is
    a command and parameters, usually a name of a group under the domain that
    follows after @.

    These commands are used to operate on data structures stored in LDAP.
    Specifically, LDAP holds nodes for groups, with more specific nodes
    for group members. These group members point to a local alias or a
    complete remote address for a remote user. Note that a remote address
    is an email address, or similar user@domain style notation. This is
    the form that we always use in ARPA2 Projects.

    The commands that Groupie supports are focussed on editing these structures
    in LDAP, and given that understanding the work done by Groupie is really
    very simple; it takes in email, derives a command from it, and applies it
    to the Service Directory LDAP. Its findings may be reported back to the
    requester.

    It’s Elementary, My Dear Watson

    The reasons that Groupie’s functions are elementary is that all use of the
    group structures is done elsewhere. This is vital, because there could be any
    number of protocols implementing collaborative semantics with group sharing.
    So, Groupie does not administer email groups, but rather leaves that to a
    separate component. This often takes the form of a
    SteamWorks Pulley
    application with a
    suitable script
    to extract the group membership relations from LDAP and, through a simple
    Pulley Backend
    that delivers the relations analysed from LDAP to an application. If you
    want your groups to end up in a couple of DBM databases for use by Postfix,
    then you can easily build that.

    So, all that Groupie needs to care about is adding and removing group
    members. Given the
    structures for groups
    with separate acceptance of a member by a group and of a group by a member,
    it is even really straightforward to do this.

    It is not a coincidence that the task of Groupie is so elementary. It is a
    result of our conscious choice to use LDAP, with its rich semantics, fine
    data model and precondition-protected atomic updates of fairly complex objects.
    It is also not a shrugging matter that Groupie is so elementary;
    there can be other interfaces to the same backend, especially
    SteamWorks Crank
    maps LDAP objects into a the HTTP space through JSON and a RESTful interface.
    The authentication and authorisation mechanisms may differ, but access to
    the underlying data model is… elementary. And it is also relatively easy
    to keep the two models in sync.

    Why do we need Groupie when we can have the interactive marvels of a web
    interface? Obviously not because we like to be retro. Groupie provides us
    with a bootstrapping mechanism for secure administration of a website. With
    DKIM readily available to anyone, it is now possible to make reasonable
    assumptions about the authenticity of users, even those that are external
    to ARPA2 tooling.

    Secure Access to Groupie

    If there’s anything that Groupie will not tolerate, it is insecure access
    attempts. The old-school approach to security to list membership is to
    send back an email with a code that has to be replicated by the receiver
    either in a reply email or through a web link. Groupie is willing and able
    to be retro, by falling back to those procedures of last century. But it has
    not been idling around since those old days, and has evolved.

    Today, many users have their email signed silently with DKIM. In fact, the
    most probably place where this is done is at the origin, so at their email
    sending service provider. This is great news, because whatever is protected
    by DKIM cannot change while it passes through. Combine that with the habit
    of TLS-encrypted connections and the common ability to pass mail directly
    from the sender domain to the recipient domain, and we have a pretty secure
    setup.

    DKIM signs email bodies as well as a selection of headers. The selection
    is dynamic, and determined by the signer, so the email message originator.
    Usually, the To: and Cc: headers are signed, as is the From: address
    and the Subject: line. In short, we have some really interesting information
    to act on (and we can always fall back on retro practices if we need to).

    When a messages arrives over LMTP, the MTA should set a header to the
    original email address, holding the +group+subscribe+bla@talks.cheap style
    address for the Groupie service. This address is (or these addresses are)
    used to sum up one or more actions to perform. Let’s take Postfix as an
    example, and say that the Groupie service is in the X-Original-To: header.

    The addresses provided in X-Original-To: are not of any cryptographic
    standing. They really need to be validated in some way. This can be
    done by validating that it has occurred in a DKIM-signed header. If not,
    it may have been supplied in an unsigned header, in which case retro security
    needs to kick in.

    The other bit of information that we are interested in, is the sender of
    the message. DKIM can validate a sender domain, and we shall make the
    (not too) liberal assumption that the domain feels better than to allow one
    user to fake the identity of another. In fact, it is up to the domain how
    well it wants to be protected. DKIM key material with or without protection
    by DNSSEC, it is a choice that would reflect back on the security of the
    group members. Anyhow, the vital point is that the sender address can be
    learned reliably from the From: header, which is also customarily
    signed with a DKIM-Signature: — and if not, Groupie zaps back to
    retro times.

    Given an authenticated command and sender, Groupie can perform most of
    its tasks. For some tasks it requires the owner to be the sender. For
    others, anyone is welcome. Yet others require group membership. In some
    of the cases, the Subject: is needed, of course under protection from
    the DKIM-Signature: or else… back to old times and bad habits.
    (The Subject: is sometimes used to contain a requested member name.)

    Supported Commands

    Groupie supports the following commands, which we shall write in the
    form after splitting over the + symbols:

    • group help [<group>] requests information [about <group>] by
      reply mail.
    • group subscribe <group> and group unsubscribe <group> add or
      remove a member from <group>. The member name is randomly
      picked by Groupie or, given a secure Subject: header with a
      <group>+<member> name, it will try to use that member name.
      The command group decline <group> is an explicit but negative
      form of subscription.
    • group invite <group> and group uninvite <group> are used by
      the group owner to invite members. There is an explicit negative
      form as well, group refuse <group>. The body of the email is
      formed as lines holding one email address each, and then when a
      message should be sent to the victims, an empty line and the
      message to send. Only plaintext bodies are processed, the rest
      is stripped away because processing it is errprone and may be
      harmful by leaking email addresses between members.
    • There is bound to be a facility for listing group members, as
      people always seem to feel comfort in breaching either privacy
      or security. Given that the membership names are relatively
      private already, this may not be a high-value commodity, even
      though it would be for spammers who need contact end points.
    • A few more commands for adminsitrative purposes are bound to
      arise. It may be beneficial to create groups over mail, for
      example. Time will tell and ACLs will be in the way.

    As mentioned before, the group part of this command is not valuable;
    consider it your argv[0] name indication, a thing to use in result
    printouts but never something on which to build value.

    Visit original content creator repository
    https://github.com/arpa2/groupie

  • Cashier-App

    Cashier-App

    Website Preview

    Cashier-App is a web-based cashier application built using React and other technologies such as API and JSONPlaceholder. The application is designed to help manage sales transactions easily and efficiently.

    Feature

    • ReactJS: Built with React for a responsive and interactive UI.
    • API Integration: Uses APIs to fetch and manage product and transaction data.
    • JSONPlaceholder: Provides dummy data for testing and development. –Dynamic UI: A dynamically updatable interface based on data retrieved from the API.

    Installation

    Make sure you have installed Node.js dan npm on your system.

    1. Clone this Repository:
    git clone https://github.com/ProjectRavel/Cashier-App.git
    1. Navigate to the frontend directory:
    cd KasirApp-react
    1. Install dependencies:
    npm install
    1. Run the application:
    npm run dev

    The application will run on http://localhost:5173 or another port specified by Vite.

    1. Run JSONPlaceholder (Backend): Open a new terminal and navigate to the backend directory:
    cd ../kasirapp-backend

    Then, run the placeholder:

    json-server --watch db.json --port 5000

    JSONPlaceholder will run on http://localhost:5000.

    Usage

    1. Access the Application: Open a browser and go to http://localhost:5173 to access the cashier application.

    2. Interact with the Backend: All product and transaction data will be fetched from the API provided by JSONPlaceholder at http://localhost:5000.

    Project Structure

    • KasirApp-react: Directory for frontend code (React).
    • kasirapp-backend: Directory for the JSONPlaceholder backend.

    Kontribusi

    Contributions are very welcome! Please fork this repository and create a pull request for any improvements or feature additions.

    Visit original content creator repository https://github.com/ProjectRavel/Cashier-App
  • PublicAPI_Hub_API

    PublicAPI_Hub_API

    Introduction

    Welcome to the PublicAPI_Hub_API! This Node.js application, built with Express, serves a curated list of public APIs available across various categories. Explore different categories and discover the APIs within them.

    API Base URL

    Technologies

    • NodeJS
    • Express

    Endpoints

    1. Get All Categories
    • Endpoint: /categories
    • Description: Retrieve a list of all available categories.
    • Example Request: GET /categories
    • Example Response:

    {
      "entries": [
        {
            "name": "Animals",
            "slug": "animals"
        },
        {
            "name": "Anime",
            "slug": "anime"
        }
      ]
    }
    1. Get APIs by Category
    • Endpoint: /categories/${catatory Name}
    • Description: Retrieve all APIs available in a specific category.
    • Example Request: GET /categories/animals
    • Example Response:

    {
      "entries": [
        {
            "API": "AdoptAPet",
            "Description": "Resource to help get pets adopted",
            "Auth": "apiKey",
            "HTTPS": true,
            "Cors": "yes",
            "Link": "https://www.adoptapet.com/public/apis/pet_list.html",
            "Category": "Animals"
        }
      ]
    }

    How to Run

    1. Clone the repository:
    git clone https://github.com/your-username/PublicAPI_Hub_API.git
    1. Install dependencies:
    npm install
    1. Start the server:
    npm start
    1. The API will be available at [http://localhost:8080]

    How to Use

    1. Make a GET request to the desired endpoint using the provided base URL.
    2. Explore available categories or retrieve APIs within a specific category.

    Contributing

    Contributions are welcome! If you find any issues or want to add new features, feel free to open an issue or submit a pull request.

    Issues and Support

    [imsyntn@gmail.com]

    Acknowledgments

    • Thanks to the creators and maintainers of the public-apis for providing the data used in this project.
    • Special thanks to Vercel for providing hosting services for this project, making it accessible to users.

    Visit original content creator repository
    https://github.com/imSyntn/PublicAPI_Hub_API