Blog

  • cli

    Low-code automation for inbound emails.

    Get a programmable email address. Automate what happens when you receive emails. It’s like Zapier for devs who hate emails.

    Table of Contents 📚

    Features

    • Low code automations for your emails
    • Create automations to filter and route emails as they hit your inbox.
    • Create an infinte number of email addresses, and automate them individually.
    • Parses every element of the email for you and provides a clean JSON object with all the metadata you will need.
    • No need to transfer over to another email provider: Use your current email provider with Mailscript.
    • Integrate your own custom coded email filters. Filter based on key words, or email header contents.
    • Redirect high priority emails to your primary inbox, keeping it clean of clutter.

    Use Cases

    • Send a text message to your phone upon receiving an important email
    • Auto reply to first time senders.
    • Save important attachments to a file server, or location of choice.

    Getting Started 🚀

    Usage 👩‍💻

    Install through npm

    In order to use the Mailscript CLI, you must first install it with the global flag. Run the following:

    $ npm install -g mailscript

    Alternatively, you could install the dev version (not recommended!)

    $ npm install -g https://github.com/mailscript/cli.git

    Basic usage

    $ mailscript COMMAND
    running command...
    $ mailscript (-v|--version|version)
    mailscript/0.4.8 darwin-x64 node-v14.15.0
    $ mailscript --help [COMMAND]
    USAGE
      $ mailscript COMMAND
    ...
    

    Login via local daemon

    $ mailscript login
    ... 
    You should see a browser window open prompting you to login to your Mailscript account. 
    The daemon will handle the rest upon completion

    Commands ⌨

    Ready to dive into Mailscript? Read the command line documentation

    Development 💬

    Development information available here

    License ⚖

    CLI license: MIT

    Visit original content creator repository
  • stm32f4-assembly

    stm32f4-assembly

    Assembly template for STM32F4 family of products using Cortex-M4 that turns on an LED connected to GPIO pin 12.

    Note that

    • This is a simple template to demonstrate the necessary items to write to a GPIO pin for educational purposes.
    • It does not need any additional libraries or startup codes.
    • Data section is not initialized, so if you use RAM, things might not work as intended.
    • Clock settings are left default.
    • Tested on STM32F4 Discovery board.

    Installation

    Clone the project using git clone https://github.com/fcayci/stm32f4-assembly.

    Development

    There are two options for development. First one is to use STM32CubeIDE from ST. Second one is the setup your own development environment. Both options are supported with relevant project settings or makefiles.

    Option 1 – STM32CubeIDE

    • Download and install STM32CubeIDE. Select a workspace then import existing project to your workspace.
    • You do not need any additional tools. It comes with the compiler and debugger pre-installed.
    • Rest of the sections are for Option 2.

    Option 2 – Custom development environment

    • Get toolchain (for compiler and binutils) from GNU Arm Embedded Toolchain
    • For windows only, install make tool. You can just get the make tool from gnuwin32. Alternatively you can install the minimalist GNU tools for windows from mingw and MSYS
    • For the programmer/debugger, you can use – stlink or OpenOCD. Though only stlink utility support is added.
    • You can use your favorite code editor to view/edit the contents. Here is an open source one: Visual Studio Code.

    Compile

    makefile contains the necessary build scripts and compiler flags.

    Browse into the directory and run make to compile. You should see a similar output as shown below.

    Cleaning...
    Building template.s
       text    data     bss     dec     hex filename
         60       0       0      60      3c template.elf
    Successfully finished...
    

    If you see any errors about command not found, make sure the toolchain binaries are in your PATH. On Windows check the Environment Variables for your account. On Linux/macOS run echo $PATH to verify your installation.

    Program

    Run make burn to program the chip.

    ...
    Flash written and verified! jolly good!
    

    Install the ST LINK drivers if you cannot see your board when make burn is run.

    Disassemble

    Run make disass to disassamble.

    Debug

    In order to debug your code, connect your board to the PC, run st-util (comes with stlink utility) from one terminal, and from another terminal within the project directory run make debug. You can then use general gdb commands to browse through the code.

    Visit original content creator repository

  • scamp

    SCAMP (Suite for Computer-Assisted Music in Python)

    SCAMP is an computer-assisted composition framework in Python designed to act as a hub, flexibly connecting the
    composer-programmer to a wide variety of resources for playback and notation. SCAMP allows the user to
    manage the flow of musical time, play notes either using FluidSynth or via MIDI or OSC messages
    to an external synthesizer, and ultimately quantize and export the result to music notation in the form of MusicXML or Lilypond.
    Overall, the framework aims to address pervasive technical challenges while imposing as little as possible on the aesthetic choices
    of the composer-programmer.

    Features

    • Flexible and extensible playback: Although SCAMP comes with a basic general MIDI soundfont,
      any .sf2 or .sf3 soundfont can be used, and playback can also include MIDI or OSC messages to external
      programs or synthesizers, which effectively offers limitless sonic possibilities.

    • Note-based, but in a broad sense: Although SCAMP conceives of music in terms of notes, notes in
      SCAMP are extremely flexible sound-objects that can include the continuous evolution of arbitrary
      playback parameters.

    • Effortless microtonality: to play the G above middle C 30 cents sharp, the user has only
      to use the MIDI pitch 67.3. Behind the scenes, SCAMP manages all the MIDI pitchbend
      messages, placing notes on separate channels where necessary so that these messages do
      not conflict.

    • Effortless playback of glissandi and dynamic envelopes. Both pitch and volume can follow
      arbitrary curves defined using the expenvelope package.

    • Flexible and precise polyphonic tempo control using clockblocks.
      In SCAMP, different layers of music moving at different tempi can be interwoven with one
      another while remaining coordinated. Smooth accelerandi and ritardandi are possible, and the
      resulting music can be quantized according to the tempo of any layer.

    • Sensible and flexible quantization. The user has a fine degree of control over how rhythms
      are quantized and over the degree of complexity in the resulting notation.

    Philosophy

    Compositional tools always feature some degree of trade-off between functionality and freedom;
    every feature that is made available to the user steers them in a certain direction. For
    instance, if a framework provides abstractions for manipulating harmonies, the user may find
    themselves (perhaps unconsciously) pushed in the direction of a particular harmonic language.
    While this may be a worthwhile trade-off in many cases, it is not the goal of SCAMP. Here,
    the goal is to provide general purpose tools, to remove the drudgery of implementing practical
    functionality that is needed again and again. Beyond this scope, users are encouraged to write
    and share their own extensions to suit their own compositional inclinations. (Several such
    extensions are available in the scamp_extensions package.)

    Other key values underlying this framework are:

    • Playback first, notation second: SCAMP has been designed so that the user interacts with an
      ensemble, not a score. This way, ideas can be quickly auditioned and iterated over based on the
      sonic result. Once the result is deemed satisfactory, the user can then export it as music notation.
    • Compact and expressive code: Efforts have been made to make user code simple, yet powerful.
      One of the ways this is accomplished is through sensible defaults; although there is a lot of
      functionality under the hood, it shouldn’t be encountered by the user until it is needed.
    • Modularity and adherence as much as possible to the Unix Philosophy.
      SCAMP bundles a number of tools together for convenience, but it may be more than a given user
      needs. For this reason, the MusicXML export capability is available separately as
      pymusicxml, the flexible musical Envelope
      class is available separately as expenvelope,
      and the system for managing musical time is available separately as clockblocks.

    Installation & Requirements

    On a properly configured computer, installing SCAMP is as simple as opening a terminal and
    running:

    pip3 install --user scamp

    (This installs it for a single user. To install it for all users on a computer, use sudo pip3 install scamp and enter your administrator password.)

    Properly configuring your computer involves:

    1. Installing Python 3.6 or greater
    2. (Linux only) Installing FluidSynth
    3. (Optional) Installing python-rtmidi
    4. (Optional) Installing abjad and LilyPond

    Each of these steps is described in greater detail below. After configuring the computer and
    running pip3 install --user scamp, you should be able to test the installation by:

    1. Opening a terminal and typing python3 to start an interactive python session.
    2. Typing in from scamp import test_run; test_run.play() and pressing return.

    If you here a piano gesture sweeping inward towards middle C, SCAMP has installed correctly!

    1) Installing Python 3.10 or greater

    Mac

    You can download and install Python 3 here: https://www.python.org/downloads/. After installation, open up a terminal and type:

    python3 --version

    You should be greeted with “Python 3.10” or something similar in response. If so, you’re all set!
    If you get something like “command not found” instead, it’s likely that something went wrong in the process of installation.

    Windows

    As on a Mac, you can download and install Python 3 here: https://www.python.org/downloads/.
    In the installer, be sure to select “Add Python 3.10 to PATH”. This allows you to invoke python from the Command Prompt
    by typing either python or py, and this should also default to the latest version of python. Test that all went
    according to plan by typing:

    python --version

    You should be greeted with “Python 3.10” or something similar in response. If so, you’re all set! For all other installation instructions below, use python instead of python3 and pip instead of pip3.

    Linux

    On Linux, Python 3.10 or greater is often already installed by default. Again, you can check this
    by opening a terminal and running:

    python3 --version

    If your version of python is already 3.10 or greater, you’re good to go. However, if your version
    of Python 3 is less than 3.10, you will have to install python 3.10 or higher, e.g. from a third
    party PPA.

    2) (Linux only) Installing FluidSynth

    SCAMP requires FluidSynth for soundfont playback, but on both Mac and Windows — due to
    the lack of a default package manager — it became clear that the path of least resistance was to
    include the compiled FluidSynth library within the SCAMP package. For this reason, you don’t need to
    take the step of installing FluidSynth to use SCAMP on Mac or Windows.

    Since Linux distros have package managers, it makes more sense to have users take the extra
    step to install FluidSynth that way. On apt-based distros like Debian and Ubuntu,
    it’s as simple as running:

    sudo apt install fluidsynth

    You are now the proud owner of a FluidSynthesizer!

    3) (Optional) Installing python-rtmidi

    For midi input, and also to generate an outgoing midi stream (which could, for instance, be
    routed to a DAW), you will need the python-rtmidi
    library. You can get this by running from a terminal:

    pip3 install --user python-rtmidi

    On Linux, if you’re running into an error you may need to first install the python3-dev
    package, for instance with the command:

    sudo apt install python3-dev

    For any other python-rtmidi installation woes, take a look at the installation instructions
    here.

    4) (Optional) Installing abjad and LilyPond

    For LilyPond output, you will need the abjad library. To do so,
    run the following:

    pip3 install abjad
    

    Note that abjad sometimes changes in a way that breaks compatibility with SCAMP. If you are using a version of abjad
    that is more recent than the one SCAMP was tested with, a warning will indicate this fact when you try to use
    it to generate notation.

    After installing abjad, you will also need to download and install LilyPond, since it
    is a dependency of abjad.

    5) (Optional) Installing scamp_extensions

    The scamp_extensions package is the place for models of music-theoretical concepts (e.g. scales, pitch-class sets),
    additional conveniences for interacting with various types of input and output, and in general anything that builds
    upon SCAMP but is outside of the scope of the main framework.

    The easiest way to install scamp_extensions is by running the command:

    pip3 install --user scamp_extensions
    

    To install the most up-to-date version (assuming you have git installed), you can instead run:

    pip3 install --user git+https://git.sr.ht/~marcevanstein/scamp_extensions
    

    This will install the latest version from this repository.

    Visit original content creator repository

  • embed-client

    Flat Sheet Music Embed Client

    Build Status NPM Version

    Flat's Sheet Music Embed

    JavaScript/TypeScript SDK to interact and receive events from our Sheet Music Embed.

    If you have any feedback or questions regarding this product, please feel free to contact our developers’ support.

    Installation

    You can install our ES/TypeScript Embed Client using npm, pnpm, or yarn:

    npm install flat-embed
    pnpm add flat-embed
    yarn add flat-embed

    Or use the latest UMD version hosted on our CDN:

    <script src="https://prod.flat-cdn.com/embed-js/v2.6.0/embed.min.js"></script>

    Getting Started

    The simplest way to get started is to pass a DOM element to our embed that will be used as container. By default, this one will completely fit its container:

    <div id="embed-container"></div>
    <script src="https://prod.flat-cdn.com/embed-js/v2.6.0/embed.min.js"></script>
    <script>
      var container = document.getElementById('embed-container');
      var embed = new Flat.Embed(container, {
        score: '<score-id-you-want-to-load>',
        embedParams: {
          appId: '<your-app-id>',
          controlsPosition: 'bottom',
        },
      });
    </script>

    Otherwise, if you are using our embed in an ES6 project:

    import Embed from 'flat-embed';
    
    const container = document.getElementById('embed-container');
    const embed = new Embed(container, {
      score: '<score-id-you-want-to-load>',
      embedParams: {
        appId: '<your-app-id>',
        controlsPosition: 'bottom',
      },
    });

    >> Open this demo in JSFiddle

    ✨ Demos

    Some demos of this Embed API are available in a dedicated repository: https://github.com/FlatIO/embed-examples.

    App ID

    Our Embed JS API requires an App ID (appId) to use it:

    • In development, you can try and use this client without limits on localhost/*.localhost.
    • To use it in production or with a custom domain, create a new app on our website, then go to the Embed > Settings and add your domains to the whitelist. Your app ID will also be displayed on this page.

    Unique users

    By default, analytics and billing of unique users is done using the visitor IPs. To improve accuracy and avoid counting the same user multiple times, you can pass a unique identifier for the user using the embedParams.userId option.

    This identifier must be a unique identifier for the user. For example, you can use the user ID of your application. Please don’t use any personal information (e.g. email address).

    import Embed from 'flat-embed';
    
    const container = document.getElementById('embed-container');
    const embed = new Embed(container, {
      score: '<score-id-you-want-to-load>',
      embedParams: {
        appId: '<your-app-id>',
        userId: '<your-end-user-id>',
      },
    });

    Embed construction

    DOM element or existing iframe

    When instantiating Flat.Embed, the first argument will always refer to a DOM element. It can take:

    • A DOM element (e.g. selected using document.getElementById('embed-container')).
    • The string identifier of the element (e.g. "embed-container").
    • An existing embed iframe element. In this case, this one will need to have our JS API loaded using the query string jsapi=true.

    If you instance a different Flat.Embed for the same element, you will always get the same instance of the object.

    Options and URL parameters

    When instantiating Flat.Embed, you can pass options in the second parameter. To use the different methods available and events subscriptions, you will need to pass at least embedParams.appId.

    Option Description Values Default
    score The score identifier that will load initially Unique score id blank
    width The width of your embed A width of the embed 100%
    height The height of your embed A height of the embed 100%
    embedParams Object containing the loading options for the embed Any URL parameters {}
    lazy Add a loading="lazy" attribute to the iframe A boolean to enable the lazy-loading false

    JavaScript API

    The full JavaScript API documentation is available at https://flat.io/developers/docs/embed/javascript.

    Quick Examples

    // Wait for the embed to be ready
    await embed.ready();
    
    // Load a score
    await embed.loadFlatScore('SCORE_ID');
    
    // Control playback
    await embed.play();
    await embed.pause();
    await embed.stop();
    
    // Listen to events
    embed.on('play', () => {
      console.log('Playback started');
    });
    
    embed.on('cursorPosition', position => {
      console.log('Cursor moved:', position);
    });

    Full API Reference

    Our SDK provides 60+ methods to control and interact with embedded scores:

    📚 View the complete API documentation →

    Editor API

    You can enable the editor mode by setting the mode to edit when creating the embed:

    var embed = new Flat.Embed(container, {
      embedParams: {
        appId: '<your-app-id>',
        mode: 'edit',
      },
    });

    Learn more about the editor mode →

    TypeScript Support

    This SDK includes TypeScript definitions out of the box. All methods and events are fully typed for better development experience.

    import Embed from 'flat-embed';
    
    const embed = new Embed(container, {
      score: 'SCORE_ID',
      embedParams: {
        appId: 'YOUR_APP_ID',
        mode: 'view', // TypeScript knows valid modes
      },
    });
    
    // Full type checking and autocompletion
    const parts = await embed.getParts();

    Support

    License

    Apache-2.0 – see LICENSE for details.

    Visit original content creator repository
  • Downloader

    Downloader 文件下载器

    DownloaderLibrary

    Download

    • HttpURLConnection下载文件依赖库,实现多任务单线程断点下载
    • 临时文件的下载长度作为断点标记

    权限

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    导入Android Studio

    添加jCenter远程依赖到module里的build.gradle:

    dependencies {
        compile 'com.excellence:downloader:_latestVersion'
      }
    

    或者直接添加本地Library依赖

    compile project(':DownloaderLibrary')
    

    使用示例

    • 初始化

      // 默认下载选项:任务数2,单任务单线程下载
      Downloader.init(Context context)
      // 设置下载选项
      Downloader.init(Context context, DownloadOptions options)
    • 结束任务

      // 暂停所有下载任务,使用文件长度保存断点
      Downloader.destroy();
    • 监听两种方式

      推荐使用注解方式监听

      • 注解监听

        // 注册
        Downloader.register(this);
        
        // 解绑
        Downloader.unregister(this);
        
        // 监听
        @Download.onPreExecute
        public void onPre(DownloadTask task)
        {
            /**
             * 注解不添加URL,则获取全部任务的下载监听;
             * 加了URL,则过滤出对应的任务的下载监听
             * 如:@Download.onPreExecute({QQ_URL, ANGRYBIRDS_URL})
             */
        }
        
        @Download.onProgressChange
        public void onProgressChange(DownloadTask task)
        {
            /**
             * @see #onPre(DownloadTask)
             */
        }
        
        @Download.onProgressSpeedChange
        public void onProgressSpeedChange(DownloadTask task)
        {
            /**
             * @see #onPre(DownloadTask)
             */
        }
        
        @Download.onCancel
        public void onCancel(DownloadTask task)
        {
            /**
             * @see #onPre(DownloadTask)
             */
        }
        
        @Download.onError
        public void onError(DownloadTask task)
        {
            /**
             * @see #onPre(DownloadTask)
             */
        }
        
        @Download.onSuccess
        public void onSuccess(DownloadTask task)
        {
            /**
             * @see #onPre(DownloadTask)
             */
        }
      • 添加下载任务,并开始下载

        // 文件路径,下载链接,监听接口可以使用IListener接口,也可以使用Listener监听部分回调
        Downloader.addTask(File file, String DownloadURL, new IListener()
        {
        
            @Override
            public void onPreExecute(long fileSize)
            {
        
            }
        
            @Override
            public void onProgressChange(long fileSize, long downloadedSize)
            {
        
            }
        
            @Override
            public void onProgressChange(long fileSize, long downloadedSize, long speed)
            {
        
            }
        
            @Override
            public void onCancel()
            {
        
            }
        
            @Override
            public void onError(DownloadError error)
            {
        
            }
        
            @Override
            public void onSuccess()
            {
        
            }
        
        }));
    • 暂停下载任务

      DownloadTask.pause();
    • 恢复下载任务

      DownloadTask.resume();
    • 删除下载任务

      DownloadTask.discard();

    修改日志

    版本 描述
    1.2.1 优化下载流程 2022-8-16
    1.2.0 提升下载速度,增加设置项 2018-7-4
    1.1.0 注解监听任务 2017-9-13
    1.0.0 多任务单线程下载,临时下载文件长度保存断点记录 2017-8-11

    注意事项

    动态申请权限,可以参考permission

    • 1.1.0以前的版本,添加了限制:必须在Activity中初始化,原因是Android6.0+需要动态申请权限
    • 1.1.0以前的版本,没有适配畸形国产机的权限(使用原生方法不能申请权限成功),需自己实现
    • 1.1.0以后的版本,去掉在Activity初始化的限制,但是畸形国产机权限(使用原生方法不能申请权限成功) 和Android6.0+需要自己实现动态申请文件读写权限,否则会导致下载失败

    Visit original content creator repository

  • dev-task-flow

    DevTaskFlow

    DevTaskFlow is a task management application built with Angular and Node.js, featuring user authentication, task filtering, sorting, and management capabilities. The app includes login, registration, password recovery, and authentication guards for secured access.

    Features

    ✅ Task Management

    • Add, edit, delete, and complete tasks
    • Task priority system (Low, Medium, High)
    • Task filtering by completion status, priority, and overdue deadlines
    • Task sorting by date and priority
    • Task searching
    • Pinned tasks feature
    • Pagination for tasks

    ✅ Authentication

    • User registration and login using MongoDB
    • Password hashing with bcrypt
    • JWT-based authentication with token storage
    • Forgot password feature (sends a new password via email)
    • Route guard to protect task management routes
    • Logout functionality

    ✅ UI & UX

    • Angular Material design
    • Responsive UI with dynamic theme switching
    • Dark/White mode toggle
    • Form validation with proper error handling
    • Preloaders for login, registration, and password recovery
    • Confirmation dialogs for critical actions (e.g., deleting all tasks)
    • Navigation Menu for better usability

    ✅ Automated Testing & CI/CD

    • Unit Testing: Jasmine & Karma for frontend unit tests
    • Continuous Integration: GitHub Actions runs automated unit tests
    • Deployment Checks: Vercel deploys only if tests pass
    • Test Reports: JUnit reports uploaded to GitHub Actions

    Tech Stack

    • Frontend: Angular 16, Angular Material
    • Backend: Node.js, Express.js, MongoDB (Mongoose)
    • Authentication: JWT, bcrypt.js
    • Email Service: Nodemailer with AOL SMTP
    • Hosting: Vercel (Frontend), Render (Backend)
    • Testing & CI/CD: Jasmine, Karma, GitHub Actions

    Installation & Setup

    Backend Setup

    1. Clone the repository:

      git clone https://github.com/art2url/dev-task-flow-auth-server.git
      cd dev-task-flow-auth-server
    2. Install dependencies:
      npm install
    3. Create a .env file in the root directory and add:

      MONGO_URI=your-mongodb-connection-string
      JWT_SECRET=your-secret-key
      EMAIL_USER=your-email@example.com
      EMAIL_PASS=your-email-password
      PORT=3000
    4. Start the server:
      npm start

      The server will run at http://localhost:3000.

    Frontend Setup

    1. Clone the repository:

      git clone https://github.com/art2url/dev-task-flow.git
      cd dev-task-flow
    2. Install dependencies:
      npm install
    3. Start the application:
      ng serve

      The app will run at http://localhost:4200.

    Deployment

    Routes

    Backend API Endpoints

    Method Endpoint Description
    POST /register Register a new user
    POST /login Login user & return JWT
    POST /forgot-password Send a new password to user email
    GET /tasks Fetch all tasks for the user
    POST /tasks Create a new task
    PUT /tasks/:taskId Update a task by ID
    DELETE /tasks/:taskId Delete a task by ID
    DELETE /tasks Delete all tasks for the user

    Frontend Routes

    Path Component Description
    /tasks TaskListComponent Main task manager (protected)
    /login LoginComponent User login page
    /register RegisterComponent User registration page
    /forgot-password ForgotPasswordComponent Password reset page

    Contributing

    Pull requests are welcome! Please ensure your changes align with the existing architecture and maintain code quality.

    License

    This project is licensed under the MIT License.

    Visit original content creator repository

  • dlock13

    dlock13

    Breakout design (in EAGLE) and source code for our door lock actuator, running on a Raspberry PI(1). Communication with the lock happens over MQTT. Does not contain user interface, check door-web for that.

    MQTT interface

    To open the door, send the number of seconds to open to:

    /bitraf/door/$door_id/open  # Ex: 20
    

    On success, will output values:

    /bitraf/door/$door_id/isopen # Ex: true/false
    /bitraf/door/$door_id/openuntil # Unix timestamp when door will lock again. Ex: 1495469392
    

    On error, will send a string with an error message:

    /bitraf/door/$door_id/error # Ex: "Time to open is negative"
    

    Where $door_id is for instance 2floor, frontdoor, 4floor. The /bitraf/door/ prefix is configurable, can be set to /mysystem/doorlocks.

    Code

    At dlock13-msgflo/dlock13.cpp.

    Impementation is in C++11, using msgflo-cpp.

    Python API

    Also provided is a simple Python module which will handle checking the MQTT messages being sent out on success/error.

    Installing

    pip install dlock13
    

    A command-line tool is included

    dlock13-open /bitraf/door/$door_id 60
    

    For how to use programatically, use dlock13-open as example code.

    Board

    RPI breakout board with components

    The board has two MOSFETS for driving standard electronic locks. Expansion for two inputs also exists.

    Single-sided board with through-hole components, can easily be CNC milled or etched.

    RPi breakout board schematic

    Pinout

    # Function | Connector pin |  BCM SoC pin |  WiringPi pin  |
    ===
    mosfet1    |     19        |   10         |  12
    mosfet2    |     2         |   11         |  14
    

    BCM SoC pin is the on used for /sys/class/gpio/gpioNN and similar.

    Deployment

    A systemd service template is normally used to each doorlock: dlock13@.service.

    systemctl status dlock13@2floor
    

    The following environment variables are used. They can be specified in /etc/dlock13/$door_id.conf.

    • MSGFLO_BROKER – the MQTT broker connection details. Ex: mqtt://user:password@mqtt.example.net
    • DLOCK13_PIN – the GPIO pin number to use. Ex: 11
    Visit original content creator repository
  • grad-leaveNotes

    GRAD LeaveNotes

    Enables you to:

    • write notes (ACE-Selfinteraction)
    • place notes on the ground
    • store notes in your (virtual) inventory (ACE-Selfinteraction)
    • read notes
    • inspect a notes handwriting
    • destroy notes

    GRAD LeaveNotes is multiplayer and JIP proof.

    Youtube Video

    Dependencies

    Installation

    Manually

    1. Create a folder in your mission root folder and name it node_modules. Then create one inside there and call it grad-leaveNotes. If you want to use a different folder name, you have to preped your description.ext with #define MODULES_DIRECTORY <yourFolderName>.
    2. Download the contents of this repository ( there’s a download link at the side ) and put it into the directory you just created.
    3. see step 3 below in the npm part

    Via npm

    for details about what npm is and how to use it, look it up on npmjs.com

    1. Install package grad-leaveNotes : npm install --save grad-leaveNotes
    2. Append the following lines of code to the description.ext:

    #include "node_modules\grad-leaveNotes\grad_leaveNotes.hpp"
    
    class CfgFunctions {
        #include "node_modules\grad-leaveNotes\cfgFunctions.hpp"
    };
    
    class CfgSounds {
    	sounds[] = {};
        #include "node_modules\grad-leaveNotes\cfgSounds.hpp"
    };

    Usage

    Using the notes system is fairly intuitive. Open up your ACE selfinteraction menu, go to “Equipment”, “Notes” and choose “Write Note”. A notepad will open up. Write whatever you like, then hit “SAVE” to put the note into your virtual inventory or hit “DROP” to place it on the ground. Use your ACE interaction key to read, pick up or destroy notes on the ground. Use your selfinteraction menu and go to “Equipment”, “Notes” again to read, drop or destroy notes in your virtual inventory.

    Use this function to enable/disable a unit to write notes (default is true):
    [unit, allow] call GRAD_leaveNotes_fnc_allowWriting;

    Use this function to enable/disable a unit to inspect notes (default is true):
    [unit, allow] call GRAD_leaveNotes_fnc_allowInspection;

    Use this function to set how many notes a unit can write (default is 10):
    [unit, amount] call GRAD_leaveNotes_fnc_setAmount;

    All of these function have to be called either on server or or client where unit is local.

    Parameter Type Explanation
    unit object The unit this applies to
    allow bool Enable or disable this ability
    amount number Amount of notes this unit can write. (Does not add to remaining amount.)

    Configuration

    You can configure this module in your description.ext. This is entirely optional however, since every setting has a default value.

    Add the class GRAD_leaveNotes to your description.ext, then add any of these attributes to configure the module:

    Attribute Default Value Explanation
    startAmount 10 (Number) How many notes a player can write by default.
    noteObject “Land_Notepad_F” (String) Note object class name.
    actOffset[] {0,0,0.1} (Array) Note object interaction point offset.
    actDist 2 (Number) Note object interaction distance.
    playerDistance 1 (Number) Distance to player at which notes will be dropped.
    visibleHandwriting 1 (1/0) is a player’s handwriting represented by a specific font?
    canWriteDefault 1 (1/0) Can everyone write notes by default?
    canInspectDefault 1 (1/0) Can everyone inspect a note’s handwriting by default?

    Example:

    class GRAD_leaveNotes {
        playerDistance = 1;             
        actOffset[] = {0,0,0.1};        
        actDist = 2;                    
        noteObject = "Land_Notepad_F";  
        startAmount = 10;               
        visibleHandwriting = 1;         
        canWriteDefault = 1;            
        canInspectDefault = 1;          
    };

    Handwriting

    By default, a note’s handwriting is represented by one of 9 fonts. So most of the times you will know that two notes are from two different authors simply by looking at them. However if two notes do seem to have the same handwriting, only inspecting them will tell you more.

    Each font has an adjective that it is described by. For example: “EtelkaMonospacePro” will show up as “elegant” handwriting upon inspection. Every handwriting also has one of three modifiers, “somewhat”, “quite”, and “remarkably”. So if two notes have the same font but show up as “quite elegant” and “somewhat elegant”, they must have been written by different authors.

    9 adjevtives and 3 modifiers give us a total of 27 different handwritings. So depending on number of players, two or more people in your game might have the same.

    Visit original content creator repository

  • EssentialCosmeticsUnlocker

    THIS REPOSITORY HAS BEEN DISCONTINUED/ARCHIVED

    Up-to-date next-gen implementation can be found here.


    EssentialCosmeticsUnlocker

    Client-side only patch that allows you to unlock ALL cosmetics (+ emotes) in the Essential mod. Works on every version of Essential MC (1.8.9 – 1.21).

    Compatibility: Infinite Download Count Discord

    How to use

    Grab the .jar you need from the Releases and place it in your .minecraft\mods\ folder. Take the time to go over the Compatibility table and its Notes.

    Features

    • Efficient, single class and light-weight thanks to mixins.
    • Unlock ALL cosmetics and emotes (including developer).
    • Universally compatible with any version (view Compatibility table).
    • Saves equipped cosmetics to config file located in AppData/Roaming/ecu.
    • Loads equipped cosmetics from config file when you toggle the Hide/Show My Cosmetics button.
    • Dumps cosmetic data in AppData/Roaming/ecu (texture, geometry) when opening the game. Useful for those looking to replicate the cosmetics in their own projects.

    Compatibility

    Feel free to contribute to this table with a PR and a convincing screenshot. Only the major versions are tested as it takes time to do it manually.

    MC Major Version Forge Fabric* Last Checked (dd/mm/yyyy)
    1.8 ❌ broken^ ⬛ not applicable 24/05/2024
    1.12 ❌ broken^️ ⬛ not applicable
    1.16 ❌ broken ❌ broken
    1.17 ❌ broken ❌ broken 19/11/2024
    1.18 ❌ broken ❌ broken
    1.19 ❌ broken ❌ broken
    1.20 ❌ broken ❌ broken 19/11/2024
    1.21 ❌ broken ❌ broken 19/11/2024

    Last Essential version checked: v1.3.5.3

    We are aware that ecu doesn’t work with the current version of essential. Either downgrade essential to v1.3.5.1 or join the discord for support.

    Tested with downloads from essential website.

    Notes

    * The mod you have downloaded from essential or modrinth is the installer/updater mod. Instead, the one that you need to place in your mods folder is the one which is located in .minecraft\essential\. You need to manually run the game with the installer/updater mod once for it to appear in that folder.

    ^ Use the legacy release -legacy.jar which has no mod class, but has shaded mixin. This is necessary because functionality changes overtime.

    Disclaimer

    This is for educational purposes only. I am not responsible for any damage caused by this tool.

    License

    GPLv3 © dxxxxy

    Visit original content creator repository
  • renovate-config

                                     Apache License
                               Version 2.0, January 2004
                            http://www.apache.org/licenses/
    
       TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    
       1. Definitions.
    
          "License" shall mean the terms and conditions for use, reproduction,
          and distribution as defined by Sections 1 through 9 of this document.
    
          "Licensor" shall mean the copyright owner or entity authorized by
          the copyright owner that is granting the License.
    
          "Legal Entity" shall mean the union of the acting entity and all
          other entities that control, are controlled by, or are under common
          control with that entity. For the purposes of this definition,
          "control" means (i) the power, direct or indirect, to cause the
          direction or management of such entity, whether by contract or
          otherwise, or (ii) ownership of fifty percent (50%) or more of the
          outstanding shares, or (iii) beneficial ownership of such entity.
    
          "You" (or "Your") shall mean an individual or Legal Entity
          exercising permissions granted by this License.
    
          "Source" form shall mean the preferred form for making modifications,
          including but not limited to software source code, documentation
          source, and configuration files.
    
          "Object" form shall mean any form resulting from mechanical
          transformation or translation of a Source form, including but
          not limited to compiled object code, generated documentation,
          and conversions to other media types.
    
          "Work" shall mean the work of authorship, whether in Source or
          Object form, made available under the License, as indicated by a
          copyright notice that is included in or attached to the work
          (an example is provided in the Appendix below).
    
          "Derivative Works" shall mean any work, whether in Source or Object
          form, that is based on (or derived from) the Work and for which the
          editorial revisions, annotations, elaborations, or other modifications
          represent, as a whole, an original work of authorship. For the purposes
          of this License, Derivative Works shall not include works that remain
          separable from, or merely link (or bind by name) to the interfaces of,
          the Work and Derivative Works thereof.
    
          "Contribution" shall mean any work of authorship, including
          the original version of the Work and any modifications or additions
          to that Work or Derivative Works thereof, that is intentionally
          submitted to Licensor for inclusion in the Work by the copyright owner
          or by an individual or Legal Entity authorized to submit on behalf of
          the copyright owner. For the purposes of this definition, "submitted"
          means any form of electronic, verbal, or written communication sent
          to the Licensor or its representatives, including but not limited to
          communication on electronic mailing lists, source code control systems,
          and issue tracking systems that are managed by, or on behalf of, the
          Licensor for the purpose of discussing and improving the Work, but
          excluding communication that is conspicuously marked or otherwise
          designated in writing by the copyright owner as "Not a Contribution."
    
          "Contributor" shall mean Licensor and any individual or Legal Entity
          on behalf of whom a Contribution has been received by Licensor and
          subsequently incorporated within the Work.
    
       2. Grant of Copyright License. Subject to the terms and conditions of
          this License, each Contributor hereby grants to You a perpetual,
          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
          copyright license to reproduce, prepare Derivative Works of,
          publicly display, publicly perform, sublicense, and distribute the
          Work and such Derivative Works in Source or Object form.
    
       3. Grant of Patent License. Subject to the terms and conditions of
          this License, each Contributor hereby grants to You a perpetual,
          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
          (except as stated in this section) patent license to make, have made,
          use, offer to sell, sell, import, and otherwise transfer the Work,
          where such license applies only to those patent claims licensable
          by such Contributor that are necessarily infringed by their
          Contribution(s) alone or by combination of their Contribution(s)
          with the Work to which such Contribution(s) was submitted. If You
          institute patent litigation against any entity (including a
          cross-claim or counterclaim in a lawsuit) alleging that the Work
          or a Contribution incorporated within the Work constitutes direct
          or contributory patent infringement, then any patent licenses
          granted to You under this License for that Work shall terminate
          as of the date such litigation is filed.
    
       4. Redistribution. You may reproduce and distribute copies of the
          Work or Derivative Works thereof in any medium, with or without
          modifications, and in Source or Object form, provided that You
          meet the following conditions:
    
          (a) You must give any other recipients of the Work or
              Derivative Works a copy of this License; and
    
          (b) You must cause any modified files to carry prominent notices
              stating that You changed the files; and
    
          (c) You must retain, in the Source form of any Derivative Works
              that You distribute, all copyright, patent, trademark, and
              attribution notices from the Source form of the Work,
              excluding those notices that do not pertain to any part of
              the Derivative Works; and
    
          (d) If the Work includes a "NOTICE" text file as part of its
              distribution, then any Derivative Works that You distribute must
              include a readable copy of the attribution notices contained
              within such NOTICE file, excluding those notices that do not
              pertain to any part of the Derivative Works, in at least one
              of the following places: within a NOTICE text file distributed
              as part of the Derivative Works; within the Source form or
              documentation, if provided along with the Derivative Works; or,
              within a display generated by the Derivative Works, if and
              wherever such third-party notices normally appear. The contents
              of the NOTICE file are for informational purposes only and
              do not modify the License. You may add Your own attribution
              notices within Derivative Works that You distribute, alongside
              or as an addendum to the NOTICE text from the Work, provided
              that such additional attribution notices cannot be construed
              as modifying the License.
    
          You may add Your own copyright statement to Your modifications and
          may provide additional or different license terms and conditions
          for use, reproduction, or distribution of Your modifications, or
          for any such Derivative Works as a whole, provided Your use,
          reproduction, and distribution of the Work otherwise complies with
          the conditions stated in this License.
    
       5. Submission of Contributions. Unless You explicitly state otherwise,
          any Contribution intentionally submitted for inclusion in the Work
          by You to the Licensor shall be under the terms and conditions of
          this License, without any additional terms or conditions.
          Notwithstanding the above, nothing herein shall supersede or modify
          the terms of any separate license agreement you may have executed
          with Licensor regarding such Contributions.
    
       6. Trademarks. This License does not grant permission to use the trade
          names, trademarks, service marks, or product names of the Licensor,
          except as required for reasonable and customary use in describing the
          origin of the Work and reproducing the content of the NOTICE file.
    
       7. Disclaimer of Warranty. Unless required by applicable law or
          agreed to in writing, Licensor provides the Work (and each
          Contributor provides its Contributions) on an "AS IS" BASIS,
          WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
          implied, including, without limitation, any warranties or conditions
          of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
          PARTICULAR PURPOSE. You are solely responsible for determining the
          appropriateness of using or redistributing the Work and assume any
          risks associated with Your exercise of permissions under this License.
    
       8. Limitation of Liability. In no event and under no legal theory,
          whether in tort (including negligence), contract, or otherwise,
          unless required by applicable law (such as deliberate and grossly
          negligent acts) or agreed to in writing, shall any Contributor be
          liable to You for damages, including any direct, indirect, special,
          incidental, or consequential damages of any character arising as a
          result of this License or out of the use or inability to use the
          Work (including but not limited to damages for loss of goodwill,
          work stoppage, computer failure or malfunction, or any and all
          other commercial damages or losses), even if such Contributor
          has been advised of the possibility of such damages.
    
       9. Accepting Warranty or Additional Liability. While redistributing
          the Work or Derivative Works thereof, You may choose to offer,
          and charge a fee for, acceptance of support, warranty, indemnity,
          or other liability obligations and/or rights consistent with this
          License. However, in accepting such obligations, You may act only
          on Your own behalf and on Your sole responsibility, not on behalf
          of any other Contributor, and only if You agree to indemnify,
          defend, and hold each Contributor harmless for any liability
          incurred by, or claims asserted against, such Contributor by reason
          of your accepting any such warranty or additional liability.
    
       END OF TERMS AND CONDITIONS
    
       APPENDIX: How to apply the Apache License to your work.
    
          To apply the Apache License to your work, attach the following
          boilerplate notice, with the fields enclosed by brackets "[]"
          replaced with your own identifying information. (Don't include
          the brackets!)  The text should be enclosed in the appropriate
          comment syntax for the file format. We also recommend that a
          file or class name and description of purpose be included on the
          same "printed page" as the copyright notice for easier
          identification within third-party archives.
    
       Copyright [yyyy] [name of copyright owner]
    
       Licensed under the Apache License, Version 2.0 (the "License");
       you may not use this file except in compliance with the License.
       You may obtain a copy of the License at
    
           http://www.apache.org/licenses/LICENSE-2.0
    
       Unless required by applicable law or agreed to in writing, software
       distributed under the License is distributed on an "AS IS" BASIS,
       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       See the License for the specific language governing permissions and
       limitations under the License.
    

    Visit original content creator repository