Blog

  • cryptoApp

    This project was bootstrapped with Create React App.

    Available Scripts

    In the project directory, you can run:

    npm start

    Runs the app in the development mode.
    Open http://localhost:3000 to view it in the browser.

    The page will reload if you make edits.
    You will also see any lint errors in the console.

    npm test

    Launches the test runner in the interactive watch mode.
    See the section about running tests for more information.

    npm run build

    Builds the app for production to the build folder.
    It correctly bundles React in production mode and optimizes the build for the best performance.

    The build is minified and the filenames include the hashes.
    Your app is ready to be deployed!

    See the section about deployment for more information.

    npm run eject

    Note: this is a one-way operation. Once you eject, you can’t go back!

    If you aren’t satisfied with the build tool and configuration choices, you can eject at any time. This command will remove the single build dependency from your project.

    Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except eject will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.

    You don’t have to ever use eject. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.

    Learn More

    You can learn more in the Create React App documentation.

    To learn React, check out the React documentation.

    Code Splitting

    This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting

    Analyzing the Bundle Size

    This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size

    Making a Progressive Web App

    This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app

    Advanced Configuration

    This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration

    Deployment

    This section has moved here: https://facebook.github.io/create-react-app/docs/deployment

    npm run build fails to minify

    This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify

    Visit original content creator repository

  • opengovui

    OpenGovUI

    Licence Version Static Template WordPress CMS

    image

    A 100% open source modern, accessible, and multilingual website template designed specifically for government portals. Available as both a static HTML template and a full WordPress CMS solution with advanced multilingual support.

    Live Demo

    🚀 Two Deployment Options

    📄 Option 1: Static Template (Recommended for simple sites)

    Perfect for straightforward government portals that don’t need content management.

    • ✅ No server required – Works with any web hosting
    • ✅ Fast loading – Pure HTML/CSS/JavaScript
    • ✅ Easy deployment – Just upload files
    • ✅ No database needed

    🎛️ Option 2: WordPress CMS (Recommended for dynamic content)

    Full content management system with advanced multilingual support and admin interface.

    • ✅ Admin dashboard – Manage content without coding
    • ✅ Custom post types – Services, Categories, Government Updates
    • ✅ Polylang integration – Professional multilingual support
    • ✅ REST API – Advanced integration capabilities
    • ✅ Content population – Automated content creation system
    • ✅ AI Translation System – Claude Sonnet 3.7 powered auto-translation

    🌟 Features

    📱 Responsive Design

    • Mobile-first approach
    • Fluid layouts that work across all device sizes
    • Optimised navigation for both desktop and mobile users

    ♿ Accessibility

    • Skip to main content functionality
    • ARIA labels where necessary
    • Semantic HTML structure
    • Government accessibility standards compliant

    🌐 Advanced Multilingual Support

    • Polylang Integration: Professional WordPress multilingual plugin support
    • Language Syncing: Automatic synchronization of meta fields across translations
    • Smart Language Detection: Automatic language mapping and detection
    • AI-Powered Translation: Claude Sonnet 3.7 API integration for intelligent translations
    • Auto-Translation Manager: Automated filling of missing translations with admin interface
    • Translation Scanning: Intelligent detection of missing translations across all content
    • Content Synchronization: Seamless content management across all languages
    • Full support for English (en_GB, en_US), Sinhala (si_LK), and Tamil (ta_LK)

    🎨 Design Features [[memory:3285333]]

    • Clean, professional government aesthetic with rounded, easy-to-read fonts
    • FontAwesome 6.5.1 icons (CDN hosted)
    • Service cards with intuitive icons
    • Grid-based layouts for services and topics
    • Social media integration
    • Custom color schemes for categories

    🔧 WordPress CMS Advanced Features

    • Custom Post Types:
      • Government Services with rich metadata
      • Service Categories with icons and colors
      • Government Updates with featured content
    • Enhanced REST API: Custom endpoints for all content types
    • Content Population System: One-click content creation with sample data
    • Meta Field Management: Service URLs, processing times, requirements, featured status
    • Admin Interface: Custom admin pages for content management
    • Language-Aware Content: All content respects current language context

    🤖 AI-Powered Translation System

    • Claude Sonnet 3.7 Integration: Advanced AI for contextually accurate translations
    • Intelligent Translation Manager:
      • Scans all content for missing translations
      • Automatically fills gaps using AI
      • Maintains translation consistency across the site
    • Admin Dashboard: Easy-to-use interface for managing translations
      • One-click translation scanning
      • Bulk auto-translation capabilities
      • Translation backup and restore
    • Multi-Language Support: Seamlessly translates between English, Sinhala, and Tamil
    • Government-Specific Context: AI trained to understand government terminology and formal language
    • API Key Management: Secure configuration for Claude API integration

    🚀 Quick Start – Static Template

    Perfect for simple government portals. No server or database required.

    Download Static Template

    # Get the static template (v1.2.0)
    git clone -b v1.2.0 https://github.com/pasan93/opengovui.git opengovui-static
    cd opengovui-static

    Deploy

    1. Local Development:

      python3 -m http.server 3000

      Open http://localhost:3000

    2. Production: Upload files to any web hosting service


    🎛️ Quick Start – WordPress CMS

    Full content management system with advanced multilingual capabilities.

    Requirements

    • PHP 8.4+
    • MariaDB/MySQL
    • Web server (Apache/Nginx) or PHP built-in server
    • Polylang Plugin (for full multilingual support)

    Installation

    # Get the WordPress version (v2.1.0)
    git clone https://github.com/pasan93/opengovui.git opengovui-cms
    cd opengovui-cms

    Setup WordPress

    1. Download WordPress Core:

      curl -O https://wordpress.org/latest.tar.gz
      tar -xzf latest.tar.gz
      cp -r wordpress/* .
      rm -rf wordpress latest.tar.gz
    2. Setup Database:

      mariadb -u root < setup_database.sql
    3. Start Server:

      php -S localhost:8080
    4. Complete Installation:

      • Open http://localhost:8080
      • Follow WordPress installation wizard
      • Install Polylang Plugin for multilingual support
      • Activate “OpenGovUI” theme
      • Configure AI Translation (Optional):
        • Add your Claude API key to wp-config.php: define('CLAUDE_API_KEY', 'your-api-key');
        • Or configure via WordPress admin: Tools → Auto Translation
      • Populate Content: Use the built-in content population system
      • Auto-Translate Content: Access Tools → Auto Translation for AI-powered translations
      • Start managing government services and content!

    📚 View Full WordPress Setup Guide


    🔧 Structure

    Static Template Structure

    opengovui-static/
    ├── index.html          # Main page
    ├── css/
    │   └── styles.css      # Styling
    ├── js/
    │   ├── i18n.js        # Internationalization
    │   └── script.js      # Interactive features
    └── images/
        └── govt-logo.png  # Government branding
    

    WordPress CMS Structure

    opengovui-cms/
    ├── wp-content/
    │   ├── themes/
    │   │   └── opengovui/           # Custom government theme
    │   │       ├── style.css        # Theme styles
    │   │       ├── index.php        # Main template
    │   │       ├── front-page.php   # Homepage template
    │   │       ├── header.php       # Header template
    │   │       ├── footer.php       # Footer template
    │   │       ├── functions.php    # Theme functionality
    │   │       ├── single-gov_service.php  # Service template
    │   │       ├── js/
    │   │       │   ├── multilingual.js     # Polylang integration
    │   │       │   └── admin-auto-translate.js
    │   │       └── includes/
    │   │           ├── content-populator.php
    │   │           └── translation-manager.php
    │   ├── plugins/
    │   │   └── polylang/           # Multilingual support
    │   └── languages/              # Translation files
    ├── wp-config.php               # Database configuration
    ├── setup_database.sql          # Database setup
    └── WORDPRESS_SETUP_GUIDE.md
    

    📚 Key Components

    WordPress CMS Features (v2.1.0)

    Custom Post Types & REST API

    • Government Services (/wp-json/wp/v2/gov_service)
      • Service icons, URLs, processing times
      • Requirements and featured status
      • Full multilingual support
    • Service Categories (/wp-json/wp/v2/service_category)
      • Custom icons and color schemes
      • Multilingual category management
    • Government Updates (/wp-json/wp/v2/gov_update)
      • Featured updates and announcements
      • Date-based sorting and archives

    Enhanced API Endpoints

    /wp-json/opengovui/v1/featured-services?lang=en  # Featured services
    /wp-json/opengovui/v1/categories?lang=si         # Service categories  
    /wp-json/opengovui/v1/updates?lang=ta           # Government updates
    /wp-json/opengovui/v1/services?lang=en          # All services
    

    Content Population System

    • One-Click Setup: Automatically creates sample government content
    • Multilingual Content: Creates content in English, Sinhala, and Tamil
    • Realistic Data: Government services, categories, and updates
    • Admin Interface: Easy-to-use content management dashboard

    Polylang Integration

    • Advanced Language Management: Professional multilingual plugin support
    • Meta Field Syncing: Automatic synchronization of custom fields across languages
    • Language Detection: Smart language mapping and detection
    • Translation Workflow: Streamlined content translation process

    i18n Implementation (Static Template)

    The template uses a straightforward i18n system:

    1. HTML Markup: Uses data-i18n attributes for translatable content:
    <h1 data-i18n="hero.title">Access government services and information in one place</h1>
    1. Language Selection: Simple language switcher in the header:
    <div class="language-selector">
        <a href="#" lang="si">සිංහල</a>
        <a href="#" lang="ta">தமிழ்</a>
        <a href="#" lang="en" class="active">English</a>
    </div>

    Main Sections

    • Header with Polylang language selector and search
    • Hero section with featured services from WordPress
    • Topic categories with dynamic icon navigation
    • Government updates with content management
    • Footer with important links and social media

    🔄 Customisation

    WordPress CMS (Recommended)

    • Admin Dashboard: Full WordPress interface for content management
    • Content Population: Use the built-in system to create sample content
    • Service Management: Add/edit services with icons, URLs, and metadata
    • Category Management: Create categories with custom colors and icons
    • Update Publishing: Manage government announcements and news
    • Multilingual Content: Full translation support via Polylang
    • Custom Fields: Rich metadata for all content types

    Static Template

    • Edit the HTML directly to change content
    • Update the data-i18n attributes and corresponding translation files
    • Modify icons by changing FontAwesome classes
    • Customize CSS for branding

    Styling

    • WordPress version inherits all static template styling
    • Edit theme’s style.css for WordPress-specific customizations
    • FontAwesome 6.5.1 included for comprehensive icon support
    • Custom color schemes available for categories

    🔌 Plugin Dependencies

    Required for Full Functionality

    • Polylang (Free): Multilingual support
      • Language management and switching
      • Content translation workflow
      • Meta field synchronization

    Recommended

    • Classic Editor: For traditional WordPress editing experience
    • Yoast SEO: Enhanced SEO with multilingual support

    📋 Version History

    • v2.1.0 – Enhanced WordPress CMS with Polylang Integration (Current)
      • Full Polylang multilingual plugin support
      • AI-powered translation system with Claude Sonnet 3.7 integration
      • Advanced REST API endpoints
      • Content population system
      • Intelligent translation manager with admin dashboard
      • Enhanced admin interface
    • v2.0.0 – WordPress CMS Integration
    • v1.2.0 – Complete Static Template with Tamil translations
    • v1.1.0 – Fira Sans typography update
    • v1.0.0 – Initial static template release

    🚀 API Documentation

    REST API Endpoints

    Custom OpenGovUI Endpoints

    # Get featured services
    GET /wp-json/opengovui/v1/featured-services?lang=en
    
    # Get service categories  
    GET /wp-json/opengovui/v1/categories?lang=si
    
    # Get government updates
    GET /wp-json/opengovui/v1/updates?lang=ta
    
    # Get all services
    GET /wp-json/opengovui/v1/services?lang=en&category=health

    Standard WordPress Endpoints

    # Government Services
    GET /wp-json/wp/v2/gov_service
    
    # Service Categories
    GET /wp-json/wp/v2/service_category
    
    # Government Updates  
    GET /wp-json/wp/v2/gov_update

    All endpoints support language parameters and return properly formatted content with metadata.


    📄 Licence

    This project is licensed under the MIT Licence – see the LICENCE file for details.

    🤝 Contributing

    Contributions are welcome! Feel free to submit pull requests or open issues for any improvements.

    📞 Support

    For support, please open an issue in the GitHub repository.


    Made with ❤️ in 🇱🇰 for better government services

    Visit original content creator repository
  • Quylthulg

    The Quylthulg Programming Language

    Overview

    Here is what is known about the programming language Quylthulg.
    Quylthulg:

    • is a programming language;
    • is named Quylthulg;
    • was designed by Chris Pressey;
    • does not, quite apart from prevailing trends in programming
      practice, shun the use of goto;
    • is, however, somewhat particular about where goto may be used
      (goto may only occur inside a data structure);
    • is purely functional (in the sense that it does not allow
      “side-effectful” updates to values);
    • forbids recursion;
    • provides but a single looping construct: foreach, which applies an
      expression successively to each value in a data structure;
    • is Turing-complete; and
    • boasts an argument-less macro expansion facility (in which recursion
      is also forbidden.)

    Syntax

    The syntax for identifiers draws from the best parts of the esteemed
    languages BASIC and Perl. Like Perl, all identifiers must be preceded by
    a $ symbol, and like BASIC, all identifiers must be followed by a $
    symbol. Well, OK, that’s for strings anyway, but we don’t care about
    their types really, so we use $ for everything. (Also, studies show
    that this syntax can help serious TeX addicts from “bugging out”.)

    A nice practical upshot of this is that identifier names may contain any
    characters whatsoever (excepting $), including whitespace.

    Because of this, the syntax for string literals can be, and is, derived
    from the syntax for identifiers. A string literal is given by a ~
    followed by an identifier; the textual content of the name of the
    identifier is used as the content of the string literal. A string
    literal consisting of a single $ symbol is given by ~~.

    Many find the syntax for labels to be quite sumilar to that for
    identifiers. (Some even find it to be quite similar.) Labels are
    preceded and followed by : symbols, and may contain any symbol except
    for :.

    Syntax for binary operations follows somewhat in the footsteps of the
    identifier syntax. It is a combination of prefix, infix, and postfix
    syntax, where the two terms must be preceeded, followed, and seperated
    by the same symbol. We call this notation panfix. It is perhaps worth
    noting that, like postfix, panfix does not require the deployment of
    arcane contrivances such as parentheses to override a default operator
    precedence. At the same time, panfix allows terms to be specified in the
    same order and manner as infix, an unquestionably natural and intuitive
    notation to those who have become accustomed to it.

    So, we give some examples:

    *+1+2+*3*
    &~$The shoes are $&&~~&~$9.99 a pair.$&&
    

    The first example might be stated as (1+2)*3 in conventional, icky
    parenthesis-ful notation, and evaluates to 9. The second evaluates to
    the string “The shoes are $9.99 a pair.”

    There are no unary operators in Quylthulg. (Note that ~ isn’t really a
    unary operator, actually not an operator at all, because it must be
    followed by an identifier, not an expression. Well, maybe it’s a special
    kind of operator then, an identifier-operator perhaps. But you see what
    I’m getting at, don’t you? Hopefully not.)

    There is a special 6-ary operator, foreach. It has its own syntax
    which will be covered below.

    Data Types

    Strings and Integers

    Yes. Also a special type called abort, of which there is a single
    value abort, which you’ll learn about later.

    Lists

    The sole data structure of note in Quylthulg is the list. Lists are
    essentially identical to those found in other functional languages such
    as Scheme: they are either the special value null, which suggests an
    empty list, or they consist of a cons cell, which is a pair of two
    other values. By convention, the first of this pair is the value of this
    list node, and the second is a sublist (a null or a cons) which
    represents the rest of this list.

    The value of a list node may be any value: a scalar such as an integer
    or a string, another (embedded sub)list, or the special value abort.
    cons cells are constructed by the , panfix operator. Some examples
    follow:

    ,1,,2,,3,null,,,
    ,1,,2,3,,
    

    The first example constructs a proper list. So-called “improper” lists,
    which purely by convention do not end with null, can also be
    constructed: that’s the second example.

    When all of the terms involved are literal constants embedded in the
    program text, there is a shorthand syntax for these list expressions,
    stolen from the Prolog/Erlang school:

    [1, 2, 3]
    [1, 2 | 3]
    

    Note, however, that [] is not shorthand for null. Note also that
    when this syntax is used, all values must be literal constants: there
    will be no tolerance for variables. There will, however, be tolerance
    for gotos and labels; see below for more on that.

    Cyclic Lists

    Labels and the goto construct enable the definition of cyclic data
    structures like so:

    :A:[1, 2, 3, goto $A$]
    :B:[1, 2, :C:[3, 4, goto $B$], 5, 6, goto $C$]
    

    Note that this can only be done in literal constant data structure
    expressions, not in , (consing) operations or expression involving a
    variable. This is to avoid the dynamic construction of labelled terms,
    which just a tad mind-bending and which I’ve decided to save for a
    sequel to Quylthulg, whatever and whenever that might be. Note also that
    labels have their own syntax during declaration, but (oh so helpfully)
    insist on being referred to in gotos by the $ syntax used for
    identifiers.

    List Operators

    The values contained in a cons cell can be extracted by the felicitous
    use of the binary operators < (‘first’) and > (‘rest’). For both of
    these operators, the left-hand side is the cons cell to operate on,
    and the right-hand side is an expression which the operator will
    evaluate to in the case that it cannot successfully extract the value
    from the cons cell (e.g., the left-hand side is not in fact a cons
    cell but rather something else like a null or a number or a string or
    abort.

    There is also an operator ; which appends one list (the right-hand
    side) onto the end of another list (the left-hand side.) This is
    probably not strictly necessary, since as we’ll see later we can probably
    build something equivalent using foreaches and macros, but what the
    hell, we can afford it. Party down.

    These list operators honour cyclic lists, so that
    >[:X: 4 | goto :X:]>abort>, to take just one instance, evaluates to 4.

    Control Flow

    Quylthulg’s sole looping construct, foreach, is a recursing abortable
    “fold” operation. It is passed a data structure to traverse, an
    expression (called the body) that it will apply to each value it
    encounters in the traversed data structure, and an initial value called
    the accumulator. Inside the body, two identifiers are bound to two
    values: the value in the data structure that the body is currently being
    applied to, and the value of the current value. The names of the
    idenfiers so bound are specified in the syntax of the foreach
    operator. The value that the body evaluates to is used as the
    accumulator for the next time the body is evaluated, on the next value
    in the data structure. The value that foreach evaluates to is the
    value of the final accumulator (emphasis mine.) The full form of this
    operator is as follows:

    foreach $var$ = data-expr with $acc$ = initial-expr be loop-expr else be otherwise-expr
    

    foreach traverses the data structure in this manner: from beginning to
    end. It is:

    • recursing, meaning if the current element of the list is itself a
      (sub)list, foreach will begin traversing that (sub)list (with the
      same body and current accumulator, natch) instead of passing the
      (sub)list to the body; and
    • abortable, meaning that the loop-expr may evaluate to a special
      value abort, which causes traversal of the current (sub)list to
      cease immediately, returning to the traversal of the containing
      list, if any.

    If the data-expr evaluates to some value besides a cons cell (for
    example, null or an integer or a string), then the loop-expr is
    ignored and the otherwise-expr is evaluated instead.

    As an example,

    -foreach $x$ = [2, 3, 4] with $a$ = 1 be *$a$*$x$* else be null-1-
    

    will evaluate to 23. On the other hand,

    foreach $x$ = null with $a$ = 1 be $a$ else be 23
    

    will also evaluate to 23.

    Macro System

    Quylthulg boasts an argument-less macro expansion system. (Yes, there is
    no argument about it: it boasts it. It is quite arrogant, you know.)
    Where-ever text of the form {foo} appears in the source code, the
    contents of the macro named foo are inserted at that point, replacing
    {foo}. This process is called the expansion of foo. But it gets
    worse: whereever text of the form {bar} appears in the contents of
    that macro called foo, those too will be replaced by the contents of
    the macro called bar. And so on. Three things to note:

    • If there is no macro called foo, {foo} will not be expanded.
    • If {foo} appears in the contents of foo, it will not be
      expanded.
    • Nor will it be expanded if it appears in the contents of foo as
      the result of expanding some other macro in the contents of foo.

    (I stand corrected. That was more like 2.5 things to note.)

    Macros can be defined and redefined with the special macro-like form
    {*[foo][bar]}. The first text between square brackets is the name of
    the macro being defined; the text between the second square brackets is
    the contents. Both texts can contain any symbols except unmatched ]‘s.
    i.e. you can put square brackets in these texts as long as they nest
    properly.

    Now you see why we don’t need arguments to these macros: you can simply
    use macros as arguments. For example,

    {*[SQR][*{X}*{X}*]}{*[X][5]}{SQR}
    

    uses an “argument macro” called X which it defines as 5 before
    calling the SQR macro that uses it.

    Note that macros are expanded before any scanning or parsing of the
    program text begins. Thus they can be used to define identifiers,
    labels, etc.

    Comments

    The macro system also provides a way to insert comments into a Quylthulg
    program. It should be noted that there are at least three schools of
    thought on this subject.

    The first school (Chilton County High School in Clanton, Alabama) says
    that most comments that programmers write are next to useless anyway
    (which is absolutely true) so there’s no point in writing them at all.

    The second school (Gonzaga College S.J. in Dublin, Ireland — not to be
    confused with Gonzaga University in Spokane, Washington) considers
    comments to be valuable as comments, but not as source code. They
    advocate their use in Quylthulg by the definition of macros that are
    unlikely to be expanded for obscure syntactical reasons. For example,
    {*[}][This is my comment!]}. Note that that macro can be expanded in
    Quylthulg using {}}; it’s just that the Gonzaga school hopes that you
    won’t do that, and hopes you get a syntax error if you try.

    The third school (a school of fish) believes that comments are valuable,
    not just as comments, but also as integral (or at least distracting)
    parts of the computation, and champions their use in Quylthulg as string
    literals involved in expressions that are ultimately discarded. For
    example, <~$Addition is fun!$<+1+2+<.

    Integration with the Rest of the Language

    To dispel the vicious rumours that the macro system used in Quylthulg
    and the Quylthulg language are really independent and separate entities
    which just happen to be sandwiched together there, we are quick to
    point out that they are bound by two very important means:

    • At the beginning of the program, at a global scope, the identifier
      $Number of Macros Defined$ is bound to an integer constant
      containing the number of unique macros that were defined during
      macro expansion before the program was parsed.
    • The panfix operator % applies macros to a Quylthulg string at
      runtime. The expression on the left-hand side should evaluate to a
      string which contains macro definitions. The expression on the
      right-hand side is the string to expand using these macro
      definitions.

    Turing-Completeness

    Now, I claim that Quylthulg is Turing-complete — that is, that it can
    compute anything that a Turing machine (or any other Turing-complete
    system) can. I would provide a proof, but since the point of a proof is
    to dispel doubt, and since you have not expressed any doubt so far (at
    least none that I have been able to observe from my vantage point), and
    since (statistically speaking anyway) you believe that fluoride in
    drinking water promotes dental health, that the sun is a giant nuclear
    furnace, that Wall Street is substantially different from Las Vegas,
    that a low-fat diet is an effective way to lose weight, that black holes
    exist, and that point of the War on Drugs is to stop people from harming
    themselves — well, in light of all that, a proof hardly seems
    called-for. Instead, I shall perform a series of short vignettes, each
    intended to invoke the spirit of a different forest animal or
    supermarket checkout animal. Then I shall spray you with a dose of a new
    household aerosol which I have invented and which I am marketing under
    the name “Doubt-B-Gone”.

    • We can use foreach as an if-then-else construct by using lists to
      represent booleans.

      Using null to represent false, and cons anything to represent
      true, we use the else part of foreach to accomplish a boolean
      if-then-else. We can employ ; to get boolean OR and nested
      foreaches to get boolean AND. (Detailed examples of these can be
      found in the unit tests of the Quylthulg reference interpreter,
      which is called “Qlzqqlzuup, Lord of Flesh”.)

    • We can construct an infinite loop by running foreach on a cyclic
      data structure.

      For example,

      foreach $x$ = :L:[1, 2, 3, goto $L$] with $a$ = 0 be $x$ else be null
      

      never finishes evaluating, and in the body, $x$ takes on the
      values 1, 2, 3, 1, 2, 3, … ad infinitum.

    • We can treat the accumulator of a foreach like an unbounded tape,
      just like on a Turing machine.

      We can pass in a cons cell where the first value is a list
      representing everything to the left of the head, and the second
      value is a list representing everything to the right of the head.
      Moving the head left or right can be accomplished by taking the
      first (<) off the appropriate list and cons (,) it onto the
      other list. There are also other ways to do it, of course. The point
      is that there is no bound specified on the length of a list in
      Quylthulg.

    • We can, in fact, make foreach act like a while construct.

      We just combine the looping forever with an if-then-else which
      evaluates to abort when the condition comes true.

    • We can give foreach a cyclic tree-like data structure which
      describes the finite control of a Turing machine.

      Although we don’t have to — we could just use nested foreaches to
      make a lot of tests against constant values.

    • We can even make foreach work like let if we need to.

      Just bind the accumulator to $Name$, refer to $Name$ in the
      body, and ignore the contents of the one-element list. Or use it to
      bind two variables in one foreach.

    PHHSHHHHHHHHHHHHHHTt.

    Discussion

    Now I’m hardly the first person to suggest using cyclic lists as an
    equivalent alternative to a general looping construct such as while.
    It has long been a stylish LISP programming
    technique
    . However,
    to comply with the Nietzschean-Calvinist mandate of our society (that
    is, to sustain the progress that will thrust us toward the
    “Perfect Meat at the End of Time” of which Hegel spoke,) we must
    demonstrate that we have innovated:

    • Quylthulg provides only this method of looping; without it, it
      would not be Turing-complete, and
    • Unlike the extant stylish programming techniques, which require
      side-effecting operations such as rplacd to pull off, Quylthulg is
      a pure functional programming language without updatable storage.

    Huzzah.

    It is somewhat sad to consider just how long Quylthulg took to design
    and how much of that labour took place aboard airplanes. It is even
    sadder to consider some of the delusions I was occupied with while
    designing it. Some of the biggest were the idea that foreach somehow
    had to be recursable for this to work — it doesn’t, but I left it in.
    For similar reasons I left in ;, the append operator. And I’ve already
    mentioned the headaches with allowing labels and gotos in expressions
    rather than only in literals.

    Long live the new flesh, eh?
    Chris Pressey
    Seattle, Washington
    Dec 6, 2008

    Visit original content creator repository

  • PyTschirper

    Introduction

    This is a simple UI program that allows you to easily explore the concept of the pytschirp project. This project builds Python language bindings for MIDI-capable synthesizers, to allow you to program these synthesizers in, you guessed it, Python.

    Real synthesizer programming.

    For the time being, currently only the Sequential Prophet Rev2 synthesizer is supported, but many more synths are on their way, let us know if you have a specific device you want supported.

    If you acquire the software, this is what you will get:

    Effectively it is a little code editor already preloaded with a python interpreter and pytschirp, so you can type into the edit window, execute the python by pressing CTRL-ENTER, and see the output, error messages, as well as the generated MIDI commands going back and forth between your computer and the synthesizer.

    You can use it a little bit like a Jupyter Notebook by selecting text and then using ALT-ENTER to execute only the selection.

    Live editing of synthesizers is possible.

    Example

    Creating the synthesizer in Python is as easy as it gets with just three lines of code:

    import pytschirp
    r = pytschirp.Rev2()
    r.detect()
    

    This will produce some MIDI messages in the lower right corner of the screen, and when everything is setup properly (the computer can talk to the Rev2), we are now ready for live editing the edit buffer of the synthesizer. For this, we will retrieve the edit buffer object:

    e = r.editBuffer()
    

    which is now “alive” in that every modification we make in python to the edit buffer, MIDI commands will be sent immediately to the synth.

    So for example, if you want to set the cutoff parameter:

    e.Cutoff = 0
    

    will set that value. Alternatively, you can get a textual print out of the whole edit buffer by doing a

    print(e.toText())
    

    Python is ideally suited to to complex things, for example randomize the track one of the gated sequencer in a specific value range by:

    import random
    e["Seq Track 1"] = [random.randrange(30, 80) for _ in range(16)]
    

    You get the gist. There are some real-life examples in the aptly called examples directory, have a look at them.

    Full documentation on the language bindings of pytschirp will be created inside the pytschirp project, head over there for the in-depth infos. pytschirp can be used standalone from any python interpreter or even Jupyter notebook, the PyTschirper UI program is only a little tool that allows people to quickly explore the idea.

    Building the software

    Supported platforms

    Tested currently only on Windows 10, but all technology used is cross platform and it should be possible to build on Linux and Mac OS, if you know what you are doing.

    Prerequisites

    We use CMake 3.14 and Visual Studio 2017 for C++. Make sure to have both of these installed. Newer Visual Studios might work as well, you can select them as generators in CMake. We also require a Python 3.6 installation.

    Downloading

    Clone with submodules from github

    git clone --recurse-submodules https://github.com/christofmuc/PyTschirper.git
    

    The recursive clone with submodules is required to retrieve the following additional modules already into the right spot inside the source tree:

    1. We use the magnificent JUCE library to immensly reduce the amount of work we have to do.
    2. juce-cmake to allow us to use JUCE and CMake together.
    3. pybind11 is the solution to use C++ code from within Python, as is done by the pytschirp project, as well as embedding Python into C++ code, which is what we do here in PyTschirper.
    4. The configure step will download (on Windows) the allmighty boost library, sorry for the bloat but I simply had no time to remove the dependency yet. All my professional projects of course rely on boost, so it is a natural to incorporate it here as well.

    Building on Windows

    Using CMake and building is a simple step if the prerequisites are fulfilled. Simply open a command line in the downloaded root directory <PyTschirpDir> and run

    cmake -S . -B builds -G "Visual Studio 15 2017 Win64"
    

    This will generate a solution file for Visual Studio in the builds subdirctory. You can build the software to run it immediately with the command

    cmake --build builds --config Release
    

    This will produce the executable in the path builds\source\Release, namely a file called PyTschirper.exe which you can double click and launch.

    Licensing

    As some substantial work has gone into the development of this, I decided to offer a dual license – AGPL, see the LICENSE.md file for the details, for everybody interested in how this works and willing to spend some time her- or himself on this, and a commercial MIT license available from me on request. Thus I can help the OpenSource community without blocking possible commercial applications.

    Contributing

    All pull requests and issues welcome, I will try to get back to you as soon as I can. Due to the dual licensing please be aware that I will need to request transfer of copyright on accepting a PR.

    About the author

    Christof is a lifelong software developer having worked in various industries, and can’t stop his programming hobby anyway.

    Visit original content creator repository

  • BizCardX-Extracting-Business-Card-Data-with-OCR

    BizCardX: Extracting Business Card Data with OCR

    Introduction

    BizCardX is a Streamlit application that effortlessly streamlines business card data extraction through advanced OCR technology. Users can easily upload card images to retrieve essential details, including company names, cardholder names, contact information, and more. With a strong focus on data security and user authentication, BizCardX ensures secure data storage and offers streamlined management via the user-friendly Streamlit UI. Experience an efficient, secure, and user-friendly solution for managing business card information effortlessly with BizCardX.

    Table of Contents

    1. Key Technologies and Skills
    2. Installation
    3. Usage
    4. Features
    5. Contributing
    6. License
    7. Contact

    Key Technologies and Skills

    • Python
    • EasyOCR
    • Data Extraction
    • Streamlit (GUI development)
    • PostgreSQL (Database management)

    Installation

    To run this project, you need to install the following packages:

    pip install easyocr
    pip install Pillow
    pip install numpy
    pip install pandas
    pip install pymongo
    pip install psycopg2
    pip install streamlit
    pip install streamlit_option_menu
    

    Usage

    To use this project, follow these steps:

    1. Clone the repository: git clone https://github.com/gopiashokan/BizCardX-Extracting-Business-Card-Data-with-OCR.git
    2. Install the required packages: pip install -r requirements.txt
    3. Run the Streamlit app: streamlit run app.py
    4. Access the app in your browser at http://localhost:8501

    Features

    BizCardX offers a range of powerful features to streamline the extraction and management of business card information with a strong emphasis on data protection.

    Business Card Data Extraction

    • Effortless Extraction: Easily extract information from business cards by uploading an image, thanks to BizCardX’s integration with the easyOCR (Optical Character Recognition) library.

    Encountering errors while extracting image data using EasyOCR in local IDEs led to the adoption of 
    Google Colab for this process
    
    • Structured Presentation: The extracted data is elegantly presented alongside the uploaded image, ensuring a clear and organized overview.

    • Comprehensive Information: Extracted details include the company name, cardholder name, designation, contact information, and address.

    • User-Friendly GUI: Navigate and interact with the user-friendly graphical interface for a seamless experience.

    Data Storage and Authentication

    • Secure Authentication: Safeguard your data with user authentication, ensuring that only authorized users can access and manage it.

    • Data Verification: Review and confirm the extracted data before it’s securely stored in the database. Make necessary changes with confidence.

    Data Management and Editing

    • Credential Verification: To edit database records, verify your credentials (username and password) for added security.

    • Effortless Editing: Easily modify your data as needed, and watch as the changes are automatically updated in the database.

    Secure Data Deletion

    • Protected Data: Ensure the safety of your data with strong user authentication, preventing unauthorized access or deletion.

    • Credentials Check: When initiating data deletion, BizCardX verifies your username and password, displaying a list of associated records.

    BizCardX emphasizes data protection, providing secure and user-friendly tools for managing your business card information.

    Contributing

    Contributions to this project are welcome! If you encounter any issues or have suggestions for improvements, please feel free to submit a pull request.

    License

    This project is licensed under the MIT License. Please review the LICENSE file for more details.

    Contact

    📧 Email: gopiashokankiot@gmail.com

    🌐 LinkedIn: linkedin.com/in/gopiashokan

    For any further questions or inquiries, feel free to reach out. We are happy to assist you with any queries.

    Visit original content creator repository

  • monkeyplug

    monkeyplug

    Latest Version VOSK Docker Images Whisper Docker Images

    monkeyplug is a little script to censor profanity in audio files (intended for podcasts, but YMMV) in a few simple steps:

    1. The user provides a local audio file (or a URL pointing to an audio file which is downloaded)
    2. Either Whisper (GitHub) or the VoskAPI is used to recognize speech in the audio file
    3. Each recognized word is checked against a list of profanity or other words you’d like muted
    4. ffmpeg is used to create a cleaned audio file, muting or “bleeping” the objectional words

    You can then use your favorite media player to play the cleaned audio file.

    If provided a video file for input, monkeyplug will attempt to process the audio stream from the file and remultiplex it, copying the original video stream.

    monkeyplug is part of a family of projects with similar goals:

    Installation

    Using pip, to install the latest release from PyPI:

    python3 -m pip install -U monkeyplug
    

    Or to install directly from GitHub:

    python3 -m pip install -U 'git+https://github.com/mmguero/monkeyplug'
    

    Prerequisites

    monkeyplug requires:

    To install FFmpeg, use your operating system’s package manager or install binaries from ffmpeg.org. The Python dependencies will be installed automatically if you are using pip to install monkeyplug, except for vosk or openai-whisper; as monkeyplug can work with both speech recognition engines, there is not a hard installation requirement for either until runtime.

    usage

    usage: monkeyplug.py <arguments>
    
    monkeyplug.py
    
    options:
      -v, --verbose [true|false]
                            Verbose/debug output
      -m, --mode <string>   Speech recognition engine (whisper|vosk) (default: whisper)
      -i, --input <string>  Input file (or URL)
      -o, --output <string>
                            Output file
      --output-json <string>
                            Output file to store transcript JSON
      -w, --swears <profanity file>
                            text file containing profanity (default: "swears.txt")
      -a, --audio-params APARAMS
                            Audio parameters for ffmpeg (default depends on output audio codec)
      -c, --channels <int>  Audio output channels (default: 2)
      -s, --sample-rate <int>
                            Audio output sample rate (default: 48000)
      -f, --format <string>
                            Output file format (default: inferred from extension of --output, or "MATCH")
      --pad-milliseconds <int>
                            Milliseconds to pad on either side of muted segments (default: 0)
      --pad-milliseconds-pre <int>
                            Milliseconds to pad before muted segments (default: 0)
      --pad-milliseconds-post <int>
                            Milliseconds to pad after muted segments (default: 0)
      -b, --beep [true|false]
                            Beep instead of silence
      -h, --beep-hertz <int>
                            Beep frequency hertz (default: 1000)
      --beep-mix-normalize [true|false]
                            Normalize mix of audio and beeps (default: False)
      --beep-audio-weight <int>
                            Mix weight for non-beeped audio (default: 1)
      --beep-sine-weight <int>
                            Mix weight for beep (default: 1)
      --beep-dropout-transition <int>
                            Dropout transition for beep (default: 0)
      --force [true|false]  Process file despite existence of embedded tag
    
    VOSK Options:
      --vosk-model-dir <string>
                            VOSK model directory (default: ~/.cache/vosk)
      --vosk-read-frames-chunk <int>
                            WAV frame chunk (default: 8000)
    
    Whisper Options:
      --whisper-model-dir <string>
                            Whisper model directory (~/.cache/whisper)
      --whisper-model-name <string>
                            Whisper model name (base.en)
      --torch-threads <int>
                            Number of threads used by torch for CPU inference (0)
    

    Docker

    Alternately, a Dockerfile is provided to allow you to run monkeyplug in Docker. You can pull one of the following images:

    • VOSK
      • oci.guero.org/monkeyplug:vosk-small
      • oci.guero.org/monkeyplug:vosk-large
    • Whisper
      • oci.guero.org/monkeyplug:whisper-tiny.en
      • oci.guero.org/monkeyplug:whisper-tiny
      • oci.guero.org/monkeyplug:whisper-base.en
      • oci.guero.org/monkeyplug:whisper-base
      • oci.guero.org/monkeyplug:whisper-small.en
      • oci.guero.org/monkeyplug:whisper-small
      • oci.guero.org/monkeyplug:whisper-medium.en
      • oci.guero.org/monkeyplug:whisper-medium
      • oci.guero.org/monkeyplug:whisper-large-v1
      • oci.guero.org/monkeyplug:whisper-large-v2
      • oci.guero.org/monkeyplug:whisper-large-v3
      • oci.guero.org/monkeyplug:whisper-large

    then run monkeyplug-docker.sh inside the directory where your audio files are located.

    Contributing

    If you’d like to help improve monkeyplug, pull requests will be welcomed!

    Authors

    • Seth GroverInitial workmmguero

    License

    This project is licensed under the BSD 3-Clause License – see the LICENSE file for details.

    Visit original content creator repository
  • atonego

    AtOneGo

    make webapp && make ios && make android – an experiment with JavaScript/NodeJS and Phonegap

    Build Status

    AtOneGo

    This is the repo of the app AtOneGo

    This file contains the documentation for developers.

    Author: Michael Wager mail@mwager.de

    TechStack – Overview

    App

    Native App via Phonegap for iOS and Android. (WebApp served via Node.js)

    • Zepto 1.0
    • Require.js
    • Lodash/Backbone.js 1.0.0
    • SocketIO (0.9.x, not used anymore)
    • mobiscroll (date & time scroller)
    • Parts from Html5Boilerplate v4.X
    • Grunt
    • Inspired by the TodoMVC project and Yeoman
    • Phonegap (v3.x)

    API and Website via Node.js (at-one-go.com)

    • Express framework (v3)
    • Mongoose (v3)
    • see api/package.json
    • Hosting at OpenShift (free plan)

    Testing

    • Mocha: bdd client- and serverside
    • PhantomJS/CasperJS: headless webkit testing
    • testem

    Cordova/Phonegap

    Plugins:

    Installiere alle Plugins:

    NOTE: To update cordova plugins we need to remove and re-add !

    cordova plugin add org.apache.cordova.console && \
    cordova plugin add org.apache.cordova.device  && \
    cordova plugin add org.apache.cordova.dialogs && \
    cordova plugin add org.apache.cordova.network-information && \
    cordova plugin add org.apache.cordova.splashscreen && \
    cordova plugin add org.apache.cordova.statusbar && \
    cordova plugin add org.apache.cordova.vibration && \
    cordova plugin add org.apache.cordova.globalization && \
    cordova plugin add https://github.com/phonegap-build/PushPlugin.git
    

    Remove all:

    cordova plugin rm org.apache.cordova.console && \
    cordova plugin rm org.apache.cordova.device  && \
    cordova plugin rm org.apache.cordova.dialogs && \
    cordova plugin rm org.apache.cordova.network-information && \
    cordova plugin rm org.apache.cordova.splashscreen && \
    cordova plugin rm org.apache.cordova.statusbar && \
    cordova plugin rm org.apache.cordova.vibration && \
    cordova plugin rm org.apache.cordova.globalization && \
    cordova plugin rm com.phonegap.plugins.PushPlugin && \
    rm -rf plugins/ios.json && rm plugins/android.json
    

    Relevant directories & files

    • /app – app sources (yeoman requirejs/backbone boilerplate)
    • /api – node.js sources (REST API, SocketIO, DB, Tests, etc)
    • /api_deployment – The openshift repo (we just copy the sources from api to this directory and push it up to openshift)
    • /api/server/website – Static files of the website at-one-go.com
    • /api/server/website/app – The WebApp will be served from here (optimized sources from /dist will be copied to this directory via make webapp)
    • /api/server/test – All backend tests
    • /test – All frontend tests
    • /dist – Created via Grunt. The optimized sources will be used in the phonegap app and the webapp
    • /mobile/ – Phonegap project directory (v3.x)
    • /docs – All software documentation

    Files

    • Makefile – The Makefile for everything
    • /app/index.html – The base html file for the phonegap app (goes to /mobile/ios/www/ or /mobile/android/assets/www/ via Makefile)
    • /app/webapp.html – The base html file for the web app (goes to api/server/website/app/ via Makefile)

    Important client side JavaScript files

    • /app/scripts/config.js – The RequireJS config file for development (see also /app/scripts/config.production.js)
    • /app/scripts/main.js – The main bootstrapper, all initial event handling (domready/deviceready, global click/touch handlers, global ajax config…)
    • /app/scripts/router.js – The AppRouter, all client side navigation is done via history api (pushstate is on phonegap apps not needed). All routes of the app are defined here, and the router takes care of the rendering of root-views (screens)

    Local installation

    1. The App

    $ cd path/to/your/projects
    $ git clone repo-url.git atonego
    $ cd atonego
    # install local build system using grunt [optional]
    $ npm install
    # NOTE: The folder `atonego` should be served via a locally installed webserver like apache
    $ open http://127.0.0.1/atonego # should serve index.html now
    

    Via phonegap

    $ make ios_build_dev && clear && t mobile/ios/cordova/console.log

    Checkout the Makefile for more information.

    2. The API

    A RESTful API for the app is written in JavaScript using Node.js, the website at-one-go.com and the webapp will be served through Node.js too.

    NOTE: The production config file api/server/config/environments/production.json is not under version control.

    $ cd api
    $ npm install       # install dependencies only once
    $ mongod &          # start mongodb if not already running
    $ node server.js    # start the node app in development mode
    

    Now checkout something like:

    Code quality && -style

    Static code analysis via JSHint (back end && front end)

    # in the project root run:
    $ jshint . # see .jshintrc and .jshintignore
    

    Before committing, jshint MUST return zero:

    $ jshint .      # see .jshintrc and .jshintignore
    $ echo $?       # output 0 ?
    
    # enable jshint git "pre-commit" hook
    touch .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit
    echo "jshint ." > .git/hooks/pre-commit
    

    Codestyle

    Inspired from here

    • Space indentation (4)
    • Single-quotes
    • Semicolons
    • Strict mode
    • No trailing whitespace
    • Variables at the top of the scope (where possible)
    • Multiple variable statements
    • Space after keywords and between arguments and operators
    • JSHint valid (see rules in the project root)

    Example: (client side using requirejs)

    define(function(require) {
        'use strict';
    
        var a = require('a'),
            b = require('b');
    
        function Foo() {}
    
        Foo.prototype = {
            bar: function() {
                return 'baz';
            }
        };
    
        return Foo;
    });

    Markers

    We mark problems and todos in the code comments via the marker XXX since using the well known marker TODO in a todo app seems not to be a good idea.

    Tests

    Overview

    All following commands should run without errors: (all from the project root)

    $ cd api && npm test
    $ testem ci
    $ casperjs test test/functional
    
    # there is a command for all of them:
    $ make all_tests
    

    API

    All server side unit & functional tests (bdd style) in: /api/server/test.

    $ cd api
    $ npm test  # mongod running? (possibly in another shell)
    

    CLIENT

    Tests in /test.

    Quick View of the Testsuite

    Clientside UNIT Tests via Mocha and testem.

    CodeCoverage /app/scripts via Blanket.js, see Tests in the Browser via testem.

    $ cd project_root
    $ testem      # default mode - Browsers can run the testsuite at http://localhost:7357
    $ testem ci   # ci mode      - run the suite in all available browsers
    

    Execute the tests in a simulator or on a device:

    $ make test_build # copies `/app` und `/test` in mobile's `www` directories
    # after that, the file config.xml (ios/android) has to be edited:
    
    <content src="https://github.com/mwager/test/index_browser.html" />
    
    Then just run:
    $ make ios # build the phonegap app with the current content of `mobile/ios/www`
    $ make android # same for `mobile/android/assets/www`...
    
    # shortcuts (config.xml!)
    $ make test_build && make ios
    $ make test_build && make android
    

    Functional tests

    Tests in /test/functional via (casperjs.org)[http://casperjs.org].

    # NOTE: Node and MongoDB must be running locally
    $ casperjs test test/functional
    

    Continuous Integration – Travis

    Build Status

    See .travis.yml and the travis page.

    Testing/Debugging via weinre

    Checkout weinre

    # Install & Run:
    $ [sudo] npm install -g weinre
    $ weinre --boundHost 192.168.1.233 --httpPort 8081 --verbose --debug --deathTimeout 60 --readTimeout 60
    >>> 2013-03-28T11:27:10.401Z weinre: starting server at ...
    

    Then include smt like this in app/index.html right after <body>:

    <script type="text/javascript">
    window.onerror = function(e) {
        alert(e);
    }
    </script>
    <script src="http://192.168.1.233:8081/target/target-script.js#anonymous"></script>
    

    and open this page with a browser.

    The API, error handling & multilingualism

    Authorization & Authentication

    We use HTTP Basic auth over SSL everywhere. On login (or signup), a secret API TOKEN gets generated from the user’s ID and a random string. This token will be encrypted via AES and sent over to the client. As RESTful APIs should be stateless, each following request must include this token in the password field of the Authorization-Header to authenticate against the service.

    Example:

    Authorization: "Basic base64encode('$username:$API_TOKEN')"
    

    NOTE:

    We cannot use custom certs and stuff on the openshift free plan so we cannot determine via node if the incoming request is secure (ssl) or not.

    Texts

    The App and the API/website were developed with support for multilingualism. The following directories include all Texts:

    • /app/scripts/libs/locales -> Texts of the App
    • /api/server/locales -> Texts of the Website & API

    Error Handling

    Models are always returning the Error as the first parameter in the callback (Node.js-Style, null on success), the second parameter can be used as return value, e.g. callback(null, user)).

    Example

    // in a model-method e.g. todolist.fetchList()
    if (!list) {
        utils.handleError('damnit some error message'); // optional logging
        return callback({key: 'listNotFound'});
    }
    return callback(err);
    
    // later: (e.g. in controllers)
    if(err && err.key) {
        // Error already logged (Log-files)
        // Usage of key via `__(key)`
        var text = __(err.key);
        // `text` is now smt like "List not found" or
        // "Liste nicht gefunden" (e.g. based on current request)
        return displayErrToUserSomehow(text);
    }
    

    Deployment

    Be sure to check out the Makefile for more infos.

    Deployment of the App via Phonegap

    Via PhoneGap for iOS [and Android]. There is a Makefile for automating tasks
    like optimizing the sources or compiling the native Apps via Phonegap.

    We generate one optimized JavaScript file (aog.js) via the requirejs optimizer, which will look something like this.

    $ make clean        # clean build directories
    $ make ios_device   # optimize sources, copy to ios `www` and build
    $ make ios          # build for ios via phonegap cli tools
    $ make android      # build for android via phonegap cli tools
    # NOTE: Shortcuts for running and logging: (phonegap catches "console.log()" calls)
    # We want a clean log file: (running in simulator)
    # 1. iOS
    $ echo "" > mobile/ios/cordova/console.log && make ios_build && clear && t mobile/ios/cordova/console.log
    # 2- Android
    # be sure to connect a real device before running the following one, else the android simulator could screw up your system (-;
    $ make android_build && make android_run && clear && adb logcat | grep "Cordova"
    

    App Store Submission (iOS)

    Then just switch “Run” and “Archive” configs to “Distribution” under “edit scheme…” in xcode.

    Google Play Store Submission

    App Versioning

    We use git tags for versioning. However, the file mobile/www/config.xml [and api/package.json and AndroidManifest.xml] should be manually updated on releases.

    Deployment of the API

    The API has its own repository at openshift. (URL: atonego-mwager.rhcloud.com) We are using a “Node.js-Catridge”, default Node-Version is 0.6.x (May 2013), but of course we want a newer version of Node.js, so we also set up this:

    https://github.com/ramr/nodejs-custom-version-openshift

    Deploy the Node App to production

    NOTE: this requires additional files (see /.gitignore).

    # 1. This command will optimize the sources using grunt and copy the generated stuff from `/dist/` to `/api/server/website/app/`:
    $ make webapp
    
    # 2. This command copies the sources from `api/*` over to `api_deployment/`
    # and pushes the stuff from there up to the openshift server.
    $ make api_deploy
    
    # restart from cli:
    $ make api_restart
    

    Openshift’s CLI Tool “rhc”

    # install: (needs ruby)
    $ gem install rhc
    
    > rhc app start|stop|restart -a {appName}
    > rhc cartridge start|stop|restart -a {appName} -c mysql-5.1
    
    When you do a git push, the app and cartridges do get restarted.  It is best if you can find any indication of why it stopped via your log files.  Feel free to post those if you need any further assistance.
    
    You can access your logs via ssh:
    > ssh $UUID@$appURL (use "rhc domain show" to find your app's UUID/appURL
    > cd ~/mysql-5.1/log (log dir for mysql)
    > cd ~/$OPENSHIFT_APP_NAME/logs (log dir for your app)
    
    # RESTART DATABASE ONLY:
    $ rhc cartridge start -a atonego -c rockmongo-1.1
    
    # RESTART APP ONLY:
    $ rhc app start -a atonego
    

    Fix quota errors at openshift: (https://www.openshift.com/kb/kb-e1089-disk-quota-exceeded-now-what)

    $ ssh ...
    $ du -h * | sort -rh | head -50
    $ rm -rf mongodb-2.2/log/mongodb.log*
    $ rm -rf rockmongo-1.1/logs/*
    $ echo "" > nodejs/logs/node.log
    
    # and remove the mongodb journal files:
    $ rm -rf  mongodb/data/journal/*
    

    Locally:

    rhc app tidy atonego
    

    openshift

    Cronjob:

    On the Production-Server at openshift, there runs a minutely cronjob, checking all todos with notifications, so Email-, PUSH- and SocketIO-messages can be sent to notify users.

    See api/.openshift/cron/minutely/atonego.sh

    The cronjob has its own logfile:

    $ ssh ...to openshift....
    $ tail -f app-root/repo/server/logs/production_cronjob.log
    

    PhoneGap Notes

    Reading

    Getting Started

    The mobile projects were created like this:

    1. downloaded: PhoneGap2.x (current 2.9.x cat mobile/ios/CordovaLib/VERSION)

    2. created ios and android projects

       $ mkdir mobile && cd mobile
       $ alias create="/path/to/phonegap-2.7.0/lib/ios/bin/create"
       $ create ios     de.mwager.atonego AtOneGo
       $ alias create="/path/to/phonegap-2.7.0/lib/android/bin/create"
       $ create android de.mwager.atonego AtOneGo
      

    Phonegap-Updates – Workflow: (#update, #upgrade, #phonegap)

    • download latest from phonegap.com
    • checkout guides per platform
    • copy all stuff manually
    • iOS: check this

    Some links:

    PUSH Notifications

    NOTE: see “Cronjobs” und also the demo script: api_deployment/server/ssl/push_demo.js

    # run demo script via
    ### DEBUG=apn node ./api_deployment/server/ssl/push_demo.js
    DEBUG=apn node ./api/server/push_demo.js
    

    Some links:

    Creating a development push certificate

    In the Apple dev member center:

    1. create development provisioning profile for app id de.mwager.atonego, download and install
    2. create development push certificate within the app id de.mwager.atonego
    3. download this certificate, open with keychain access, export private key (.p12 file)
    4. checkout this PUSH Tutorial to create the certificates for the server

    Testing the certificate:

    Note: use gateway.sandbox.push.apple.com in development (same port)

    $ openssl s_client -connect gateway.push.apple.com:2195 -cert api/server/ssl/ck.pem -key api/server/ssl/ck.pem
    # Output should be smt like:
    Enter pass phrase for api/server/ssl/ck_dev.pem:
    ******
    CONNECTED(00000003)
    ...
    Server certificate
    -----BEGIN CERTIFICATE-----
    ....
    
    Node.js and PUSH Notifications

    • create ssl files
    • see api/server/ssl/push_demo.js -> sends a push message to hardcoded device token
    The phonegap’s PushPlugin

    See the GitHub Page.

    Installed via plugman:

    $ cd mobile
    $ plugman --platform android --project ./platforms/android --plugin https://github.com/phonegap-build/PushPlugin.git
    $ plugman --platform ios --project ./platforms/ios --plugin https://github.com/phonegap-build/PushPlugin.git
    

    Problems, Solutions, Workarounds, Known Bugs

    Performance

    1. check this
    2. and that

    Underscores in filenames

    Avoid underscores in files and folders because Phonegap may fail to load the
    contained files in Android. This is a known issue.

    Edits

    Zepto, Backbone

    In a mobile environment like phonegap, memory management will be much more important than in the web. Variables in the global namespace are not cleaned up by the js engine’s garbage collector, so keeping our variables as local as possible is a must.
    To avoid polluting the global namespace as much as possible, Zepto, Backbone and some other files in /app/scripts/libs were edited, see “atonego”.

    Libs which are still global:

    • window._ -> /app/scripts/libs/lodash.js
    • window.io -> /app/scripts/libs/socket.io.js [not used anymore]
    Zepto errors

    Zepto’s touch module was edited to prevent lots of strange errors like:

    TypeError: 'undefined' is not an object file:///var/mobile/Applications/XXXXXXXXXX/atonego.app/www/scripts/libs/zepto.js on line 1651
    

    Search /app/scripts/lib/zepto.js for “atonego”.

    iOS does not allow HTTP Requests against self-signed/invalid certs…

    On iOS devices, there were problemes with the api endpoint at https://atonego-mwager.rhcloud.com/api. The following workaround is necessary!

    The file /mobile/ios/atonego/Classes/AppDelegate.m was edited: (at the bottom)

    @implementation NSURLRequest(DataController)
    + (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
    {
        return YES;
    }
    @end
    

    ratchet.css && junior.js

    The files /app/styles/ratchet.css and /app/scripts/libs/junior_fork.js were edited to match our requirements.

    Thanks to:

    Disabled attributes & the tap event

    The “disabled state” (“<button … disabled …/>”) will not be captured. So on every “tap” we must check if the element has an disabled attribute or class.

    Ghostclicks

    This is one of the most annoying problems I have ever had. Checkout main.js and router.js for some workarounds.

    Socket IO

    UPDATE: We do not use socket io anymore as its kind of senseless having an open connection in a todo-app. PUSH notifications should be enough. If you want to use websockets via phonegap on iOS, better do not use socketio version 0.9.

    The app always crashed on resume after a (little) longer run. I was about to give up, then I found this

    SocketIO’s “auto reconnect” somehow crashed the app on the iOS test devices (seg fault!). As a workaround I disconnect the websocket connection on Phonegap’s pause-event, and manually re-connect (using same socket/connection again) on the resume-event.

    See also:

    Testflight Notes:

    • Create the *.IPA file via XCode: check “iOS device”, then: Product > Archive

    Install the app on a real iOS device via xCode

    • Create provisioning profile, download, copy profile via organizer to device , (dblclick installs in xcode first)
    • XCode: update codesigning identity according to the downloaded provisioning profile (project AND target)

    The cronjob

    A minutely cronjob runs on the server, checking all todos which are due now, so we can notify users. However, I could not figure out a good solution to re-use my existing (running) node app for this. The current workaround is to listen for a POST to a specific URL, and POSTing to that URL via curl from the cronjob with some pseudo credentials set to “make sure” that the request came from the shell script, not from outside )-:

    Search /api/worker.js -> “cron”

    Console testing

    Open the app in chrome or safari (dev or live), then open the dev console and put in some of the following commands to play with the app:

    # as there is (almost) nothing global, we must require stuff first, use this as template:
    > var $ = require('zepto'), app = require('app'), common = require('common');
    
    # then try some of these (-:
    > app.VERSION
    > app.isMobile
    > app.changeLang('de') // or app.changeLang('en') if currently in german
    > app.router.go('help')
    > window.history.back()
    > var list = app.todolists.get('object id of list from url or app.todolists');
    > list.toJSON()
    // URL: #todolists
    list.set('title', 'hello world')
    > app.fetchUser() // watch network tab
    
    var list = app.todolists.get('get id hash from url');
    list.set('title', '');
    

    Todos

    See docs/TODOs.md

    Visit original content creator repository