Simple plugin implementing a personal ToDo list on the user’s Moodle dashboard.
The main purpose of this plugin is to demonstrate usage of advanced coding techniques available in recent Moodle versions. Most notably:
- Rendering HTML output via Mustache templates
- AJAX based workflow of the elementary CRUD operations.
- Organising JS into AMD modules.
- Organising external functions into traits.
- Low-level access to the database via persistent models.
- Using exporters for handling the data structures in rendering and AJAX.
phpcs-security-audit is a set of PHP_CodeSniffer rules that finds flaws or weaknesses related to security in PHP and its popular CMS or frameworks.
It currently has core PHP rules as well as Drupal 7 specific rules. Next planned CMS/framework is Symfony 2, which are also relevant to Moodle.
As a bonus set of rules, the tool also check for CVE issues and security advisories related to CMS/framework. You can use it in order to follow the versioning of components during static code analysis.
The main reasons of this project for being an extension of PHP_CodeSniffer is to have easy integration into continuous integration systems and to be able to find security bugs that are not detected with object oriented analysis (like in RIPS or PHPMD).
- Install: https://moodle.org/plugins/local_codechecker
- Git clone above github project (phpcs-security-audit)
- Follow project’s README install instructions, and also…
- Copy https://github.com/FloeDesignTechnologies/phpcs-security-audit/tree/master/Security/Sniffs/BadFunctions folder into your Moodle local/codechecker/moodle/Sniffs
- Copy https://github.com/FloeDesignTechnologies/phpcs-security-audit/tree/master/Security/Sniffs/CVE folder into your Moodle local/codechecker/moodle/Sniffs
Dynomite, inspired by Dynamo whitepaper, is a thin, distributed dynamo layer for different storage engines and protocols. Currently these include Redis and Memcached. Dynomite supports multi-datacenter replication and is designed for high availability.
The ultimate goal with Dynomite is to be able to implement high availability and cross-datacenter replication on storage engines that do not inherently provide that functionality. The implementation is efficient, not complex (few moving parts), and highly performant.
Also, checkout (alternatives?):
Webgrind is a Xdebug profiling web frontend in PHP. It implements a subset of the features of kcachegrind and installs in seconds and works on all platforms. For quick’n’dirty optimizations it does the job. Here’s a screenshot showing the output from profiling:
- Super simple, cross platform installation – obviously 🙂
- Track time spent in functions by self cost or inclusive cost. Inclusive cost is time inside function + calls to other functions.
- See if time is spent in internal or user functions.
- See where any function was called from and which functions it calls.
- Generate a call graph using gprof2dot.py
Suggestions for improvements and new features are more than welcome – this is just a start.
– architecture related issues (e.g. design pattern violations)
– weak types control and possible code construct simplifications
– performance issues
– non-optimal, duplicate and suspicious “if” conditions
– validation of magic methods usage
– regular expressions
– validation of exception handling workflow
– compatibility issues
– variety of time-consuming bugs
– PhpUnit API usage
– security issues
In the case of a failover, Orchestrator changes the MySQL topology and promotes a new master. But who lets the application know about this change? This is where ProxySQL helps us.
In Moodle 3.1, the mobile app added support for “Remote add-ons“. This support allows plugin providers to add support so that their plugin can function within the mobile app.
Now, I should point out that Moodle is currently working on a much simpler system for adding mobile support to your plugin, but it will be a while before it is ready. When it is ready, the work I am about to undertake will likely be moot.
This post will be the first in a series where I will attempt to add mobile support for my questionnaire module. I say “attempt”, because this will be using some technologies that I am not familiar with so I will be learning as I go. I won’t guarantee success, but I will document the efforts.
SCORM is a technical standard developed by Advanced Distributed Learning Initiative (ADL) over 16 years ago that governs how online learning content and Learning Management Systems (LMSs) communicate with each other. It is the mature de facto industry standard for e-learning interoperability the pre-dates mobile learning and IOT.
cmi5 is a new specification that was co-developed by ADL and the Aviation Industry Computer-Based Training Committee (AICC). This new specification defines how “LMSs launch content” using the Experience API (xAPI) as the content-to-LMS communication layer. cmi5 builds upon the lessons learned from AICC and SCORM specifications, address the limitations of each, and adds new capabilities. cmi5 uses xAPI which was designed with both traditional and non-traditional learning methods (Social, Mobile, Simulations, VR etc.) in mind. cmi5’s use of xAPI enables the development of interoperable features well beyond the traditional LMS model. cmi5 is a key component of an xAPI based learning ecosystem and an excellent starting point for organizations that wish to adopt xAPI.
cmi5 provides the following functionality that SCORM does not:
- Richer Data Collection. Record any data you want (and get it back!)- SCORM is limited to a “list” of data collected. cmi5 is open-ended on the data you can collect.
- Share Data more easily – cmi5 uses a web service and data structure that allows easy integration with other systems/applications.
- Distributed Content – cmi5 content can reside anywhere, it allows for content as a service.
- Elimination of “Pop-up” Windows – eliminate pop-up blocker headaches
- Mobile app launch support – cmi5 content does not require a browser. Content could be a mobile app.
Part Three – Indexing More of your Plugin
In the last post, I added more searchable content to my plugin’s search indexing function, so that additional information fields specific to each instance of a plugin were included. Now I’m going to try and add question content to the search indexing.