24 years developing SWAD and OpenSWAD. Hits, misses and lessons learned. Including implementation details of the timeline or social network integrated into this free software Learning Management System developed by Antonio Cañas, professor of the University of Granada (Spain).
This document summarizes new features in HTML5 including CSS3 features like media queries, rounded corners, and transitions. It also covers JavaScript APIs like localStorage, IndexedDB, the cache manifest, drag and drop, web sockets, and the file system API. The document provides examples and links to demonstrations of these new capabilities, making it a useful resource for learning about HTML5 features and seeing them in action.
The Importance Things of Full Stack DevelopmentMike Taylor
Full Stack web technologies including Node.js, AngularJS and MongoDB Development for fornt End & Back End web & Mobile Application Development.
Brainvire's skilled team of developer help you to make your application attractive & effective.
For more : http://www.brainvire.com/full-stack-development
The document provides an introduction to programming for non-technical entrepreneurs, including a definition of programming languages, a brief history of programming, common programming roles and processes, popular programming languages and tools, basic programming concepts, and considerations for creating websites and mobile apps. It aims to give non-technical founders an overview of the programming landscape to help them communicate effectively with technical teams.
This document provides an overview and timeline of SWAD, an open source learning management system developed at the University of Granada since 1999. It discusses the history and features of SWAD, the process of releasing it as free and open source software in 2010, usage statistics from its deployment at the University of Granada, and efforts to promote its international adoption through openswad.org since 2012. The success of SWAD at the university is attributed to it being open to the entire institution, training for teachers, user support, development driven by user requests, and its functionality, usability, simplicity and reliability.
Amruth Kumar Juturu is a computer science graduate with a Master's degree from Texas A&M University and a Bachelor's degree from Indian Institute of Information Technology. He has work experience as an intern at Nvidia and as a senior software developer at Citrix R&D India. Currently he is a graduate assistant at the Supercomputing Facility at TAMU where he provides technical support to users. He has strong skills in programming languages like C/C++, Java, Python and tools like MPI, OpenMP, CUDA. His academic and work projects include developing a virtual machine manager, transport drivers, proxy servers and device overlays.
This document summarizes Christos Tsakostas' presentation on automatic programming at the #1 Automatic Programming Meetup in Athens, Greece on June 19th, 2019. The presentation covered the goals of promoting automation in the software lifecycle and acquiring knowledge of modern practices. It provided an overview of the current state of code generation, including tools for websites, apps, business processes, and machine learning. PolyGenesis, a platform for automatic programming, was introduced along with future plans to stabilize the platform, expand generators, and explore machine learning. Attendees were encouraged to contribute ideas and participate in future meetups on testing, domain-driven design, and event-driven architectures.
This document summarizes new features in HTML5 including CSS3 features like media queries, rounded corners, and transitions. It also covers JavaScript APIs like localStorage, IndexedDB, the cache manifest, drag and drop, web sockets, and the file system API. The document provides examples and links to demonstrations of these new capabilities, making it a useful resource for learning about HTML5 features and seeing them in action.
The Importance Things of Full Stack DevelopmentMike Taylor
Full Stack web technologies including Node.js, AngularJS and MongoDB Development for fornt End & Back End web & Mobile Application Development.
Brainvire's skilled team of developer help you to make your application attractive & effective.
For more : http://www.brainvire.com/full-stack-development
The document provides an introduction to programming for non-technical entrepreneurs, including a definition of programming languages, a brief history of programming, common programming roles and processes, popular programming languages and tools, basic programming concepts, and considerations for creating websites and mobile apps. It aims to give non-technical founders an overview of the programming landscape to help them communicate effectively with technical teams.
This document provides an overview and timeline of SWAD, an open source learning management system developed at the University of Granada since 1999. It discusses the history and features of SWAD, the process of releasing it as free and open source software in 2010, usage statistics from its deployment at the University of Granada, and efforts to promote its international adoption through openswad.org since 2012. The success of SWAD at the university is attributed to it being open to the entire institution, training for teachers, user support, development driven by user requests, and its functionality, usability, simplicity and reliability.
Amruth Kumar Juturu is a computer science graduate with a Master's degree from Texas A&M University and a Bachelor's degree from Indian Institute of Information Technology. He has work experience as an intern at Nvidia and as a senior software developer at Citrix R&D India. Currently he is a graduate assistant at the Supercomputing Facility at TAMU where he provides technical support to users. He has strong skills in programming languages like C/C++, Java, Python and tools like MPI, OpenMP, CUDA. His academic and work projects include developing a virtual machine manager, transport drivers, proxy servers and device overlays.
This document summarizes Christos Tsakostas' presentation on automatic programming at the #1 Automatic Programming Meetup in Athens, Greece on June 19th, 2019. The presentation covered the goals of promoting automation in the software lifecycle and acquiring knowledge of modern practices. It provided an overview of the current state of code generation, including tools for websites, apps, business processes, and machine learning. PolyGenesis, a platform for automatic programming, was introduced along with future plans to stabilize the platform, expand generators, and explore machine learning. Attendees were encouraged to contribute ideas and participate in future meetups on testing, domain-driven design, and event-driven architectures.
This document provides an overview and timeline of the development of SWAD, an open-source learning management system created at the University of Granada in 1999. It discusses the initial creation of SWAD to manage courses and students, its release as free and open-source software in 2010, and the subsequent creation of openswad.org to offer the platform for free worldwide. The summary also notes that SWAD has been used by over 150,000 users at the University of Granada and details some of the keys to its success there, such as being open to the entire university.
This is a one hour technical talk by @wescpy on serverless computing with Google Cloud (Platform). It starts with a review of all of cloud computing then dives into serverless computing, demonstrates multiple products, and shows inspirational examples of apps built using these technologies. There is a bonus section covering serverless in-practice featuring how to think about app development, common use cases, flexibility, best practices, and local dev & testing.
Industrial training project ppt of online shoppinganil kumar
The document describes a summer training project developing an e-commerce website called "ddjewellers.in" for online jewellery sales. The project was developed using ASP.NET and C# for the front end, and SQL Server for the back end. Key features included seller, buyer, and admin modules, with functionality for product browsing, purchases, and account management. The trainees gained experience in web development principles and software engineering best practices through completing the project.
The document discusses HTML5, including what it is, its features, adoption, and changes from previous versions of HTML. It provides information on new HTML5 elements like <header>, <footer>, <nav>, <section>, and <article>. It also covers new form input types, multimedia support through <video> and <audio> elements, canvas graphics, geolocation, web sockets, and more. The document contains examples and explanations of how to implement and use various HTML5 features.
[Srijan Wednesday Webinars] How to Build a Cloud Native Platform for Enterpri...Srijan Technologies
Drupal has been a consistent leader in the Gartner Magic Quadrant for Web Content Management. However, enterprises leveraging Drupal have traditionally relied on PaaS providers for their hosting, scaling and lifecycle management. And that usually leads to enterprise applications being locked-in with a particular cloud or vendor.
As container and container orchestration technologies disrupt the cloud and platform landscape, there’s a clear way to avoid this state of affairs. In this webinar, we discuss why it's important to build a cloud-native Drupal platform, and exactly how to do that.
Join the webinar to understand how you can avoid vendor lock-in, and create a secure platform to manage, operate and scale your Drupal applications in a multi-cloud portable manner.
Key Takeaways:
- Why you need a cloud-native Drupal platform and how to build one
- How to craft an idiomatic development workflow
- Understanding infrastructure and cloud engineering - under the hood
- Demystifying the art and science of Docker and Kubernetes: deep dive into scaling the LAMP stack
- Exploring cost optimization and cloud governance
- Understand portability of applications
- A hands-on demo of how the platform works
Azure + DataStax Enterprise Powers Office 365 Per User StoreDataStax Academy
We will present our O365 use case scenarios, why we chose Cassandra + Spark, and walk through the architecture we chose for running DataStax Enterprise on azure.
This document provides an overview of a coding bootcamp introduction hosted by AstroLabs Academy. It outlines the agenda, content, deliverables, and tips for getting the most out of the program. The bootcamp will cover introductory topics like HTML, CSS, JavaScript, as well as frameworks like React and Node.js. It emphasizes that web development is the easiest domain to get started in and recommends focusing on JavaScript skills.
This document provides an introduction to modern DevOps technologies. It discusses DevOps concepts like source code management using Git, different methods of deploying programs including using bare metal servers, virtualization, containers, and cloud functions. Specific container and container orchestration technologies like Docker and Kubernetes are explained. Continuous integration and continuous delivery (CI/CD) practices are also introduced. The presentation includes an agenda with slides on these topics and ends with a question and answer section and announcement of a Docker workshop to deploy an HTTP server container.
The document provides an agenda for a technical skills workshop covering several topics:
1. Predictions for software development technology in 2019 based on developer surveys, CES 2019 trends, and trends in the software industry.
2. Popular emerging technologies including frontend solutions at Grab and SMAC technologies (Social, Mobile, Analytics, Cloud, IoT).
3. Skills needed for software engineers in 2019 including methodologies for software design, programming, requirements analysis, and development.
Mastering Dynamic Web Designing A Comprehensive Guide.pdfIbrandizer
Dynamic Web Designing involves creating interactive and adaptable web pages that respond to user input and change dynamically, enhancing user experience with real-time data, animations, and personalized content tailored to individual preferences.
The PPT contains the following content:
1. What is Google Cloud Study Jam
2. What is Cloud Computing
3. Fundamentals of cloud computing
4. what is Generative AI
5. Fundamentals of Generative AI
6. Breif overview on Google Cloud Study Jam.
7. Networking Session.
The document discusses LinkedIn's adoption of the Dust templating language in 2011. Some key points:
- LinkedIn needed a unified view layer as different teams were using different templating technologies like JSP, GSP, ERB.
- They evaluated 26 templating options and selected Dust as it best met their criteria like performance, i18n support, and being logic-less.
- Dust templates are compiled to JavaScript for client-side rendering and to Java for server-side rendering (SSR) through Google's V8 engine, allowing templates to work on both client and server.
- SSR addresses challenges like SEO, supporting clients without JavaScript, and i18n by rendering
Gajendra Kumar is a C programmer with over 6 years of experience working with C/C++, Linux, and embedded C. He has worked as both a senior software engineer and technical lead for iGATE Global Solutions on projects involving cache management, browsers, and application linking. He also has experience developing firmware as a C programmer for STJ Electronics. He is proficient with tools like Momentics QNX IDE, KEIL, and Eclipse. He has a Bachelor's degree in computer science and additional qualifications in software engineering.
Demystifying Decoupled Drupal for Developers & Content AuthorsRachel Wandishin
Today, with the diversity of customer experiences, developers require a WCM that provides flexibility and creativity in display output, and the ability to build innovative experiences that take advantage of diverse front-ends (i.e. JavaScript frameworks and libraries).
Join our session to learn how Acquia’s WCM, Drupal, delivers universal content flexibility — providing the greatest creative flexibility to front-end developers and content authors to build content-rich experiences for any channel, device or mode of interaction.
We’ll cover how the Acquia platform supports decoupled Drupal architectures and how you might use Drupal in three different modes that cover the “best of all worlds” - traditional, decoupled, and progressively decoupled WCM. As a result, developers have full flexibility and creativity, and content creators have full content management control - only Drupal provides this flexibility to all stakeholders.
During this webinar, we will investigate the following topics:
- An intro to decoupled Drupal concepts, options & supported features
- Decoupled Drupal best practices and trade offs
- Acquia customer case studies using decoupled Drupal
- Decoupled Drupal improvements and upcoming releases
This document discusses responsive design and how it can be implemented in TYPO3. It defines responsive design as using fluid grids that resize based on browser width rather than fixed width layouts. It recommends using flexible layouts, images, and media queries to build responsive sites. Popular frameworks like Bootstrap and Foundation are introduced to help with responsive design. The document provides examples and resources for creating responsive sites that adapt to different screen sizes.
The document discusses the original promise of DevOps to bridge silos between development and operations teams and enable continuous delivery. It outlines the key tools and trends that emerged over the past 5 years, including Git, Docker, Kubernetes, GitHub Actions, Terraform, and the shift to treating infrastructure as code. The document also presents examples of CI/CD pipelines used by the author's team to provision AWS accounts and deploy environments for applications.
This project proposal aims to solve map-reduce problems using a distributed cluster of web browsers instead of dedicated servers. It proposes making web browsers thin clients that can perform computations in the background without requiring installation. The server would divide problems and assign parts to browser clients. This could utilize unused computational resources of personal systems and bandwidth. Key challenges include implementing map-reduce algorithms across clients and server, optimization strategies, and handling failures. The technology could allow large-scale information mining by delegating intensive tasks to client browsers without companies needing additional hardware.
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsPeter Muessig
The UI5 tooling is the development and build tooling of UI5. It is built in a modular and extensible way so that it can be easily extended by your needs. This session will showcase various tooling extensions which can boost your development experience by far so that you can really work offline, transpile your code in your project to use even newer versions of EcmaScript (than 2022 which is supported right now by the UI5 tooling), consume any npm package of your choice in your project, using different kind of proxies, and even stitching UI5 projects during development together to mimic your target environment.
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesQuickdice ERP
Explore the seamless transition to e-invoicing with this comprehensive guide tailored for Saudi Arabian businesses. Navigate the process effortlessly with step-by-step instructions designed to streamline implementation and enhance efficiency.
This document provides an overview and timeline of the development of SWAD, an open-source learning management system created at the University of Granada in 1999. It discusses the initial creation of SWAD to manage courses and students, its release as free and open-source software in 2010, and the subsequent creation of openswad.org to offer the platform for free worldwide. The summary also notes that SWAD has been used by over 150,000 users at the University of Granada and details some of the keys to its success there, such as being open to the entire university.
This is a one hour technical talk by @wescpy on serverless computing with Google Cloud (Platform). It starts with a review of all of cloud computing then dives into serverless computing, demonstrates multiple products, and shows inspirational examples of apps built using these technologies. There is a bonus section covering serverless in-practice featuring how to think about app development, common use cases, flexibility, best practices, and local dev & testing.
Industrial training project ppt of online shoppinganil kumar
The document describes a summer training project developing an e-commerce website called "ddjewellers.in" for online jewellery sales. The project was developed using ASP.NET and C# for the front end, and SQL Server for the back end. Key features included seller, buyer, and admin modules, with functionality for product browsing, purchases, and account management. The trainees gained experience in web development principles and software engineering best practices through completing the project.
The document discusses HTML5, including what it is, its features, adoption, and changes from previous versions of HTML. It provides information on new HTML5 elements like <header>, <footer>, <nav>, <section>, and <article>. It also covers new form input types, multimedia support through <video> and <audio> elements, canvas graphics, geolocation, web sockets, and more. The document contains examples and explanations of how to implement and use various HTML5 features.
[Srijan Wednesday Webinars] How to Build a Cloud Native Platform for Enterpri...Srijan Technologies
Drupal has been a consistent leader in the Gartner Magic Quadrant for Web Content Management. However, enterprises leveraging Drupal have traditionally relied on PaaS providers for their hosting, scaling and lifecycle management. And that usually leads to enterprise applications being locked-in with a particular cloud or vendor.
As container and container orchestration technologies disrupt the cloud and platform landscape, there’s a clear way to avoid this state of affairs. In this webinar, we discuss why it's important to build a cloud-native Drupal platform, and exactly how to do that.
Join the webinar to understand how you can avoid vendor lock-in, and create a secure platform to manage, operate and scale your Drupal applications in a multi-cloud portable manner.
Key Takeaways:
- Why you need a cloud-native Drupal platform and how to build one
- How to craft an idiomatic development workflow
- Understanding infrastructure and cloud engineering - under the hood
- Demystifying the art and science of Docker and Kubernetes: deep dive into scaling the LAMP stack
- Exploring cost optimization and cloud governance
- Understand portability of applications
- A hands-on demo of how the platform works
Azure + DataStax Enterprise Powers Office 365 Per User StoreDataStax Academy
We will present our O365 use case scenarios, why we chose Cassandra + Spark, and walk through the architecture we chose for running DataStax Enterprise on azure.
This document provides an overview of a coding bootcamp introduction hosted by AstroLabs Academy. It outlines the agenda, content, deliverables, and tips for getting the most out of the program. The bootcamp will cover introductory topics like HTML, CSS, JavaScript, as well as frameworks like React and Node.js. It emphasizes that web development is the easiest domain to get started in and recommends focusing on JavaScript skills.
This document provides an introduction to modern DevOps technologies. It discusses DevOps concepts like source code management using Git, different methods of deploying programs including using bare metal servers, virtualization, containers, and cloud functions. Specific container and container orchestration technologies like Docker and Kubernetes are explained. Continuous integration and continuous delivery (CI/CD) practices are also introduced. The presentation includes an agenda with slides on these topics and ends with a question and answer section and announcement of a Docker workshop to deploy an HTTP server container.
The document provides an agenda for a technical skills workshop covering several topics:
1. Predictions for software development technology in 2019 based on developer surveys, CES 2019 trends, and trends in the software industry.
2. Popular emerging technologies including frontend solutions at Grab and SMAC technologies (Social, Mobile, Analytics, Cloud, IoT).
3. Skills needed for software engineers in 2019 including methodologies for software design, programming, requirements analysis, and development.
Mastering Dynamic Web Designing A Comprehensive Guide.pdfIbrandizer
Dynamic Web Designing involves creating interactive and adaptable web pages that respond to user input and change dynamically, enhancing user experience with real-time data, animations, and personalized content tailored to individual preferences.
The PPT contains the following content:
1. What is Google Cloud Study Jam
2. What is Cloud Computing
3. Fundamentals of cloud computing
4. what is Generative AI
5. Fundamentals of Generative AI
6. Breif overview on Google Cloud Study Jam.
7. Networking Session.
The document discusses LinkedIn's adoption of the Dust templating language in 2011. Some key points:
- LinkedIn needed a unified view layer as different teams were using different templating technologies like JSP, GSP, ERB.
- They evaluated 26 templating options and selected Dust as it best met their criteria like performance, i18n support, and being logic-less.
- Dust templates are compiled to JavaScript for client-side rendering and to Java for server-side rendering (SSR) through Google's V8 engine, allowing templates to work on both client and server.
- SSR addresses challenges like SEO, supporting clients without JavaScript, and i18n by rendering
Gajendra Kumar is a C programmer with over 6 years of experience working with C/C++, Linux, and embedded C. He has worked as both a senior software engineer and technical lead for iGATE Global Solutions on projects involving cache management, browsers, and application linking. He also has experience developing firmware as a C programmer for STJ Electronics. He is proficient with tools like Momentics QNX IDE, KEIL, and Eclipse. He has a Bachelor's degree in computer science and additional qualifications in software engineering.
Demystifying Decoupled Drupal for Developers & Content AuthorsRachel Wandishin
Today, with the diversity of customer experiences, developers require a WCM that provides flexibility and creativity in display output, and the ability to build innovative experiences that take advantage of diverse front-ends (i.e. JavaScript frameworks and libraries).
Join our session to learn how Acquia’s WCM, Drupal, delivers universal content flexibility — providing the greatest creative flexibility to front-end developers and content authors to build content-rich experiences for any channel, device or mode of interaction.
We’ll cover how the Acquia platform supports decoupled Drupal architectures and how you might use Drupal in three different modes that cover the “best of all worlds” - traditional, decoupled, and progressively decoupled WCM. As a result, developers have full flexibility and creativity, and content creators have full content management control - only Drupal provides this flexibility to all stakeholders.
During this webinar, we will investigate the following topics:
- An intro to decoupled Drupal concepts, options & supported features
- Decoupled Drupal best practices and trade offs
- Acquia customer case studies using decoupled Drupal
- Decoupled Drupal improvements and upcoming releases
This document discusses responsive design and how it can be implemented in TYPO3. It defines responsive design as using fluid grids that resize based on browser width rather than fixed width layouts. It recommends using flexible layouts, images, and media queries to build responsive sites. Popular frameworks like Bootstrap and Foundation are introduced to help with responsive design. The document provides examples and resources for creating responsive sites that adapt to different screen sizes.
The document discusses the original promise of DevOps to bridge silos between development and operations teams and enable continuous delivery. It outlines the key tools and trends that emerged over the past 5 years, including Git, Docker, Kubernetes, GitHub Actions, Terraform, and the shift to treating infrastructure as code. The document also presents examples of CI/CD pipelines used by the author's team to provision AWS accounts and deploy environments for applications.
This project proposal aims to solve map-reduce problems using a distributed cluster of web browsers instead of dedicated servers. It proposes making web browsers thin clients that can perform computations in the background without requiring installation. The server would divide problems and assign parts to browser clients. This could utilize unused computational resources of personal systems and bandwidth. Key challenges include implementing map-reduce algorithms across clients and server, optimization strategies, and handling failures. The technology could allow large-scale information mining by delegating intensive tasks to client browsers without companies needing additional hardware.
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsPeter Muessig
The UI5 tooling is the development and build tooling of UI5. It is built in a modular and extensible way so that it can be easily extended by your needs. This session will showcase various tooling extensions which can boost your development experience by far so that you can really work offline, transpile your code in your project to use even newer versions of EcmaScript (than 2022 which is supported right now by the UI5 tooling), consume any npm package of your choice in your project, using different kind of proxies, and even stitching UI5 projects during development together to mimic your target environment.
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesQuickdice ERP
Explore the seamless transition to e-invoicing with this comprehensive guide tailored for Saudi Arabian businesses. Navigate the process effortlessly with step-by-step instructions designed to streamline implementation and enhance efficiency.
Mobile App Development Company In Noida | Drona InfotechDrona Infotech
Drona Infotech is a premier mobile app development company in Noida, providing cutting-edge solutions for businesses.
Visit Us For : https://www.dronainfotech.com/mobile-application-development/
Odoo releases a new update every year. The latest version, Odoo 17, came out in October 2023. It brought many improvements to the user interface and user experience, along with new features in modules like accounting, marketing, manufacturing, websites, and more.
The Odoo 17 update has been a hot topic among startups, mid-sized businesses, large enterprises, and Odoo developers aiming to grow their businesses. Since it is now already the first quarter of 2024, you must have a clear idea of what Odoo 17 entails and what it can offer your business if you are still not aware of it.
This blog covers the features and functionalities. Explore the entire blog and get in touch with expert Odoo ERP consultants to leverage Odoo 17 and its features for your business too.
An Overview of Odoo ERP
Odoo ERP was first released as OpenERP software in February 2005. It is a suite of business applications used for ERP, CRM, eCommerce, websites, and project management. Ten years ago, the Odoo Enterprise edition was launched to help fund the Odoo Community version.
When you compare Odoo Community and Enterprise, the Enterprise edition offers exclusive features like mobile app access, Odoo Studio customisation, Odoo hosting, and unlimited functional support.
Today, Odoo is a well-known name used by companies of all sizes across various industries, including manufacturing, retail, accounting, marketing, healthcare, IT consulting, and R&D.
The latest version, Odoo 17, has been available since October 2023. Key highlights of this update include:
Enhanced user experience with improvements to the command bar, faster backend page loading, and multiple dashboard views.
Instant report generation, credit limit alerts for sales and invoices, separate OCR settings for invoice creation, and an auto-complete feature for forms in the accounting module.
Improved image handling and global attribute changes for mailing lists in email marketing.
A default auto-signature option and a refuse-to-sign option in HR modules.
Options to divide and merge manufacturing orders, track the status of manufacturing orders, and more in the MRP module.
Dark mode in Odoo 17.
Now that the Odoo 17 announcement is official, let’s look at what’s new in Odoo 17!
What is Odoo ERP 17?
Odoo 17 is the latest version of one of the world’s leading open-source enterprise ERPs. This version has come up with significant improvements explained here in this blog. Also, this new version aims to introduce features that enhance time-saving, efficiency, and productivity for users across various organisations.
Odoo 17, released at the Odoo Experience 2023, brought notable improvements to the user interface and added new functionalities with enhancements in performance, accessibility, data analysis, and management, further expanding its reach in the market.
Top Benefits of Using Salesforce Healthcare CRM for Patient Management.pdfVALiNTRY360
Salesforce Healthcare CRM, implemented by VALiNTRY360, revolutionizes patient management by enhancing patient engagement, streamlining administrative processes, and improving care coordination. Its advanced analytics, robust security, and seamless integration with telehealth services ensure that healthcare providers can deliver personalized, efficient, and secure patient care. By automating routine tasks and providing actionable insights, Salesforce Healthcare CRM enables healthcare providers to focus on delivering high-quality care, leading to better patient outcomes and higher satisfaction. VALiNTRY360's expertise ensures a tailored solution that meets the unique needs of any healthcare practice, from small clinics to large hospital systems.
For more info visit us https://valintry360.com/solutions/health-life-sciences
Microservice Teams - How the cloud changes the way we workSven Peters
A lot of technical challenges and complexity come with building a cloud-native and distributed architecture. The way we develop backend software has fundamentally changed in the last ten years. Managing a microservices architecture demands a lot of us to ensure observability and operational resiliency. But did you also change the way you run your development teams?
Sven will talk about Atlassian’s journey from a monolith to a multi-tenanted architecture and how it affected the way the engineering teams work. You will learn how we shifted to service ownership, moved to more autonomous teams (and its challenges), and established platform and enablement teams.
Unveiling the Advantages of Agile Software Development.pdfbrainerhub1
Learn about Agile Software Development's advantages. Simplify your workflow to spur quicker innovation. Jump right in! We have also discussed the advantages.
8 Best Automated Android App Testing Tool and Framework in 2024.pdfkalichargn70th171
Regarding mobile operating systems, two major players dominate our thoughts: Android and iPhone. With Android leading the market, software development companies are focused on delivering apps compatible with this OS. Ensuring an app's functionality across various Android devices, OS versions, and hardware specifications is critical, making Android app testing essential.
UI5con 2024 - Bring Your Own Design SystemPeter Muessig
How do you combine the OpenUI5/SAPUI5 programming model with a design system that makes its controls available as Web Components? Since OpenUI5/SAPUI5 1.120, the framework supports the integration of any Web Components. This makes it possible, for example, to natively embed own Web Components of your design system which are created with Stencil. The integration embeds the Web Components in a way that they can be used naturally in XMLViews, like with standard UI5 controls, and can be bound with data binding. Learn how you can also make use of the Web Components base class in OpenUI5/SAPUI5 to also integrate your Web Components and get inspired by the solution to generate a custom UI5 library providing the Web Components control wrappers for the native ones.
How Can Hiring A Mobile App Development Company Help Your Business Grow?ToXSL Technologies
ToXSL Technologies is an award-winning Mobile App Development Company in Dubai that helps businesses reshape their digital possibilities with custom app services. As a top app development company in Dubai, we offer highly engaging iOS & Android app solutions. https://rb.gy/necdnt
Measures in SQL (SIGMOD 2024, Santiago, Chile)Julian Hyde
SQL has attained widespread adoption, but Business Intelligence tools still use their own higher level languages based upon a multidimensional paradigm. Composable calculations are what is missing from SQL, and we propose a new kind of column, called a measure, that attaches a calculation to a table. Like regular tables, tables with measures are composable and closed when used in queries.
SQL-with-measures has the power, conciseness and reusability of multidimensional languages but retains SQL semantics. Measure invocations can be expanded in place to simple, clear SQL.
To define the evaluation semantics for measures, we introduce context-sensitive expressions (a way to evaluate multidimensional expressions that is consistent with existing SQL semantics), a concept called evaluation context, and several operations for setting and modifying the evaluation context.
A talk at SIGMOD, June 9–15, 2024, Santiago, Chile
Authors: Julian Hyde (Google) and John Fremlin (Google)
https://doi.org/10.1145/3626246.3653374
A neural network is a machine learning program, or model, that makes decisions in a manner similar to the human brain, by using processes that mimic the way biological neurons work together to identify phenomena, weigh options and arrive at conclusions.
The Key to Digital Success_ A Comprehensive Guide to Continuous Testing Integ...kalichargn70th171
In today's business landscape, digital integration is ubiquitous, demanding swift innovation as a necessity rather than a luxury. In a fiercely competitive market with heightened customer expectations, the timely launch of flawless digital products is crucial for both acquisition and retention—any delay risks ceding market share to competitors.
Flutter is a popular open source, cross-platform framework developed by Google. In this webinar we'll explore Flutter and its architecture, delve into the Flutter Embedder and Flutter’s Dart language, discover how to leverage Flutter for embedded device development, learn about Automotive Grade Linux (AGL) and its consortium and understand the rationale behind AGL's choice of Flutter for next-gen IVI systems. Don’t miss this opportunity to discover whether Flutter is right for your project.
14 th Edition of International conference on computer visionShulagnaSarkar2
About the event
14th Edition of International conference on computer vision
Computer conferences organized by ScienceFather group. ScienceFather takes the privilege to invite speakers participants students delegates and exhibitors from across the globe to its International Conference on computer conferences to be held in the Various Beautiful cites of the world. computer conferences are a discussion of common Inventions-related issues and additionally trade information share proof thoughts and insight into advanced developments in the science inventions service system. New technology may create many materials and devices with a vast range of applications such as in Science medicine electronics biomaterials energy production and consumer products.
Nomination are Open!! Don't Miss it
Visit: computer.scifat.com
Award Nomination: https://x-i.me/ishnom
Conference Submission: https://x-i.me/anicon
For Enquiry: Computer@scifat.com
Consistent toolbox talks are critical for maintaining workplace safety, as they provide regular opportunities to address specific hazards and reinforce safe practices.
These brief, focused sessions ensure that safety is a continual conversation rather than a one-time event, which helps keep safety protocols fresh in employees' minds. Studies have shown that shorter, more frequent training sessions are more effective for retention and behavior change compared to longer, infrequent sessions.
Engaging workers regularly, toolbox talks promote a culture of safety, empower employees to voice concerns, and ultimately reduce the likelihood of accidents and injuries on site.
The traditional method of conducting safety talks with paper documents and lengthy meetings is not only time-consuming but also less effective. Manual tracking of attendance and compliance is prone to errors and inconsistencies, leading to gaps in safety communication and potential non-compliance with OSHA regulations. Switching to a digital solution like Safelyio offers significant advantages.
Safelyio automates the delivery and documentation of safety talks, ensuring consistency and accessibility. The microlearning approach breaks down complex safety protocols into manageable, bite-sized pieces, making it easier for employees to absorb and retain information.
This method minimizes disruptions to work schedules, eliminates the hassle of paperwork, and ensures that all safety communications are tracked and recorded accurately. Ultimately, using a digital platform like Safelyio enhances engagement, compliance, and overall safety performance on site. https://safelyio.com/
1. 1
1
Antonio Cañas et al.
Nov 3, 2023, Granada, Spain
24 years developing SWAD:
hits, misses & lessons learned
Including timeline implementation
Antonio Cañas
University of Granada
@acanasvargas acanas@ugr.es acanas@openswad.org
https://openswad.org/ @openswad
3. SWAD
“swad: a bunch, a grouping
of a number of similar things”
.
https://www.thefreedictionary.com/swad
4. Sistema Web de Apoyo a la Docencia
(Web System for Teaching Support)
⬇
Social Workspace At a Distance
https://swad.ugr.es/ https://openswad.org/
A web platform to manage courses, students and teachers,
with functions to support teaching and learning.
SWAD
5. SWAD
This is how it looks.
Some parts of its appearance,
such as colors or icons, are customizable
6. SWAD: Features
Free software · 10 languages · Responsive design · Android
app · iOS app · Face-to-face or blended learning
Hierarchical organization: System · Countries · Institutions
(universities, companies) · Centers (faculties, schools) ·
Degrees · Courses · Group types · Groups
10 available roles: Unknown · Guest · User · Student · Non-
editing teacher · Teacher · Degree admin · Center admin ·
Institution admin · System admin
7. SWAD: Features
Social network · Calendar · Notifications · Course
information · Syllabus · Documents · Shared files ·
Portfolio · Grades · Assignments · Projects · Exam
announcements · Quizzes · Exams · Games · Rubrics ·
Groups · Lists of students and teachers · Attendance
control using QR codes · Forums · Notices · Messaging
system · Surveys · Statistics · Agenda · Preferences
All features in
https://github.com/acanas/swad-core/wiki/UserGuide.en
8. SWAD: History
●
LMS in 1999: WebCT
(1997), Moodle (1999)
Radio Granada, May 12, 2000
I just want to test
if it's possible to fill out
the student record card
via the web
9. SWAD: History
●
LMS in 1999: WebCT
(1997), Moodle (1999)
Version 4.2.1, May 13, 2003
(it was not called SWAD yet)
I just want to test
if it's possible to fill out
the student record card
via the web
10. SWAD: History
●
LMS in 2023: a very broad offer
●
Hundreds of LMS (Learning Management Systems)
●
proprietary / free software
●
expensive / free of charge
●
specific / generic
●
installable on the client's servers / accessible in the cloud
15. Software: HTML
●
HTML (HyperText Markup Language)
●
1990 (Tim Berners-Lee)
●
Standard language for documents to be displayed in a web browser
●
Describes the semantic structure of a web page
●
...by using tags and attributes: <a href="https://openswad.org/">...</a>
●
Assisted by CSS (appearance) and JavaScript (behavior)
●
Web browsers
●
receive HTML documents from a web server
●
render the documents into multimedia web pages
16. Software: HTML
●
HTML:
<html lang="en">
<head>
<link rel="stylesheet"
href="https://openswad.org/swad/swad21.95.5.css"
type="text/css" />
<script type="text/javascript"
src="https://openswad.org/swad/swad21.92.js">
</script>
<title>
OpenSWAD: social learning platform
</title>
</head>
<body class="BODY_GREY" onload="init();">
<!-- HTML depending on action -->
</body>
</html>
HTML code
in user’s browser
20. Software: CSS
“Learning HTML and CSS is a lot more challenging
than it used to be. Responsive web design adds more
layers of complexity to design and develop websites.”
Jacob Lett – Digital Marketing & Web Development Manager
21. Software: CSS
●
CSS (Cascading Style Sheets) language
●
1996 (Håkon Wium Lie, Bert Bos)
●
Separates
●
presentation (layout, colors, fonts)
●
content
of an HTML document
●
Multiple web pages can share formatting in a .css file
●
“Cascading”: priority scheme
●
determines which style rule applies if more than one rule matches a particular element
22. Software: CSS
●
CSS:
.Tml_COM_TEXTAREA
{
box-sizing: border-box;
margin: 0;
resize: none;
}
@media only screen and (max-width: 590px)
{ /* For mobile-phones */
...
.Tml_RIGHT_WIDTH {width: 260px;} /* 500-240 */
...
}
@media only screen and (min-width: 590px)
{ /* For tablets and desktop */
...
.Tml_RIGHT_WIDTH {width: 500px;}
...
}
swad23.35.1.css
23. Software: JavaScript
“The strength of JavaScript is that you can do
anything. The weakness is that you will.”
Reg Braithwaite – Canadian programmer and writer
24. Software: JavaScript
●
JavaScript:
●
1995 (Brendan Eich, Netscape, Sun)
●
Multi-paradigm, interpreted / just-in-time compiled, syntax similar to C and Java
●
Modern browsers interpret JavaScript code
●
embedded in the web page
●
or in a .js file
to add interactive features
●
Interacts with the Document Object Model (DOM)
●
Represents a document as a logical tree, each node is an object (part of the document )
25. <form method="post" action="https://openswad.org/en">
<input type="hidden" name="act" value="1492">
<input type="hidden" name="ses" value="6BJQ...G46g">
<input type="hidden" name="Who" value="4">
<textarea name="Txt" rows="1" maxlength="1000"
placeholder="New post…"
class="Tml_COM_TEXTAREA Tml_RIGHT_WIDTH"
onfocus="expandTextarea (this, 'id_EwuT...BhSs_6', '6');">
</textarea>
<div id="id_EwuT...BhSs_6" style="display:none;">
...
<button type="submit" class="...">
Post
</button>
</div>
</form>
Software: JavaScript
●
HTML:
Textarea used to write the post
27. Software: JavaScript
●
HTML
●
JavaScript:
/*****************************************************************************/
/*********************** Expand textarea when focus **************************/
/*****************************************************************************/
// Called from a textarea onfocus
function expandTextarea (textareaElem,idButton,rows) {
textareaElem.rows = rows;
document.getElementById(idButton).style.display = '';
}
swad22.49.js
<textarea name="Txt" rows="1" maxlength="1000"
placeholder="New post…"
class="Tml_COM_TEXTAREA Tml_RIGHT_WIDTH"
onfocus="expandTextarea (this, 'id_EwuT...BhSs_6', '6');">
</textarea>
28. Software: CGI in C
“C is quirky, flawed, and an enormous success.”
Dennis Ritchie – Creator of the C programming language
29. Software: CGI in C
●
C language
●
imperative, procedural, general-purpose
●
1970s (Dennis Ritchie)
●
Use
●
Remains widely used in OSs, device drivers, embedded system applications, libraries...
●
Decreasingly used for application software
●
Hardly used for the web
30. Software: CGI in C
●
All code is contained within functions
●
Function parameters are passed by value
●
Pass-by-reference is simulated by passing pointers
#include <stdio.h>
int main (void)
{
printf ("hello, worldn");
return 0;
}
main.c
compiled, not interpreted
31. Software: CGI in C
●
Common Gateway Interface (CGI)
1.The user submits a web form on a web page (eg by clicking on a submit button)
2.The form's data is sent by browser to web server within an HTTP request with a URL
denoting a server CGI script in a cgi-bin directory
●
Written in a scripting language (eg Perl)
●
Or may be a compiled program (a C program in our case)
3.The web server (Apache in our case) launches the CGI script in a new process, passing
the form data to it
4.The output sent to standard output by the CGI script, usually in the form of HTML, is
passed to the client browser instead of being shown on-screen in a terminal window
32. Up to 400K times per day in 2014
Up to 2000 times / minute (30 times / second)
Software: CGI in C
“click”
logged access
HTML5 + CSS3 + JavaScript
server
MySQL database
swad-core
37. ●
HTML:
<form method="post" action="https://openswad.org/en">
<input type="hidden" name="act" value="1492">
<input type="hidden" name="ses" value="6BJQ...G46g">
<input type="hidden" name="Who" value="4">
<textarea name="Txt" rows="6" maxlength="1000"
placeholder="New post…"
class="Tml_COM_TEXTAREA Tml_RIGHT_WIDTH"
onfocus="expandTextarea (this, 'id_EwuT...BhSs_6', '6');">
</textarea>
<div id="id_EwuT...BhSs_6" style="">
...
<button type="submit" class="...">
Post
</button>
</div>
</form>
Software: CGI in C
Textarea used to write the post
38. ●
HTML:
<form method="post" action="https://openswad.org/en">
<input type="hidden" name="act" value="1492">
<input type="hidden" name="ses" value="6BJQ...G46g">
<input type="hidden" name="Who" value="4">
<textarea name="Txt" rows="6" maxlength="1000"
placeholder="New post…"
class="Tml_COM_TEXTAREA Tml_RIGHT_WIDTH"
onfocus="expandTextarea (this, 'id_EwuT...BhSs_6', '6');">
</textarea>
<div id="id_EwuT...BhSs_6" style="">
...
<button type="submit" class="...">
Post
</button>
</div>
</form>
Software: CGI in C
Button clicked to submit the post
39. Software: CGI in C
●
Input:
Method ← getenv ("REQUEST_METHOD");
ContentType ← getenv ("CONTENT_TYPE");
if (!strcmp (Method,"GET")) { // GET method
ContentLength = strlen (getenv ("QUERY_STRING"));
/* Copy query string from environment variable */
QueryString = malloc (ContentLength + 1);
Str_Copy (QueryString,getenv ("QUERY_STRING"),ContentLength);
}
else { // POST method
ContentLength ← getenv ("CONTENT_LENGTH");
/* Copy query string from stdin */
QueryString = malloc (ContentLength + 1);
fread (QueryString,sizeof (char),ContentLength,stdin);
}
/* Parse QueryString creating linked list of parameters */
Par_CreateListOfParams ();
Simplified C code on the server (swad-core)
40. Software: CGI in C
●
Output:
fprintf (stdout,"Content-type: text/html;rnrn"
"<!DOCTYPE html>n");
HTM_TxtF ("<html lang="%s">n",
Lan_STR_LANG_ID[Gbl.Prefs.Language]);
HTM_Txt ("<head>n");
HTM_TxtF ("<link rel="stylesheet" href="%s/%s" type="text/css" />n",
Cfg_URL_SWAD_PUBLIC,CSS_FILE);
HTM_TxtF ("<script type="text/javascript" src="%s/%s">n",
Cfg_URL_SWAD_PUBLIC,JS_FILE);
HTM_Txt ("</script>n");
...
HTM_Txt ("</head>n");
HTM_Txt ("<body onload="init();">n");
/* Write HTML depending on action */
...
HTM_Txt ("</body>n");
HTM_Txt ("</html>n");
Simplified C code on the server (swad-core)
41. Software: CGI in C
●
Output:
void HTM_TxtF (const char *fmt,...) {
va_list ap;
int NumBytesPrinted;
char *Attr;
if (fmt)
if (fmt[0]) {
va_start (ap,fmt);
NumBytesPrinted = vasprintf (&Attr,fmt,ap);
va_end (ap);
if (NumBytesPrinted < 0) // -1 if no memory or any other error
Err_NotEnoughMemoryExit ();
/***** Print HTML *****/
HTM_Txt (Attr);
free (Attr);
}
}
Simplified C code on the server (swad-core)
void HTM_Txt (const char *Txt) {
if (Txt)
if (Txt[0])
fputs (Txt,Gbl.F.Out);
}
43. Software: Database
“Information is the oil of the 21st century, and
analytics is the combustion engine.”
Peter Sondergaard – Former CEO of Gartner, Inc.
45. Software: Other modules
“We build our computer systems the way we build our
cities: over time, without a plan, on top of ruins.”
Ellen Ullman – American computer programmer and author
46. Software: Other modules
●
User photos
●
Our own automatic system for detecting
faces and improving the quality of
photos, trained with 90K photos
●
Program written in C++ / OpenCV and
called from swad-core
●
Daniel J. Calandria Hernández
●
Jesús Mesa González
47. Software: Other modules
●
Photo average
●
Average / median
photo, pixel by pixel,
of all the students of a
degree
●
Program written in C++
/ OpenCV and called
from swad-core
Daniel J. Calandria
Hernández
48. Software: Other modules
●
API
●
It is possible to develop add-ons (plugins) that run on:
●
other servers
●
mobile devices
●
SWADroid, iSWAD, Triswados
●
The plugins interact with swad-core through its integrated API
●
https://openswad.org/api/
49. Software: Other modules
●
SWADroid
●
App for Android
●
https://play.google.com/store/apps/details?id=es.ugr.swad.swadroid
By Juan Miguel Boyero Corral (2010-2023)
●
https://github.com/Amab/SWADroid
50. Software: Other modules
●
Former developers:
Antonio Manuel Aguilera Malagón (2012, QR attendance control)
●
https://github.com/aguilerin/SWADroid
●
https://es.slideshare.net/antonioaguileramalagon/swadroid-pasar-lista-manual-de-usuario
Helena Rodríguez Gijón (2012, file download, registration in groups, notices)
●
https://es.slideshare.net/helenarguez/swa-droid-f4
●
https://swadroid.wordpress.com/2012/11/17/publicado-swadroid-0-10-1/
●
https://github.com/hrguez
José Antonio Guerrero Avilés (2014, course information, messages)
●
https://github.com/antonio314/SWADroid
●
https://es.slideshare.net/JoseAntonioGuerreroA/presentacion-proyecto-fin-de-carrera-ampliacion-de-swadroid
●
https://www.linkedin.com/in/antonioguerreroaviles/overlay/50268922/single-media-viewer/
●
https://www.linkedin.com/in/antonioguerreroaviles/overlay/50268914/single-media-viewer/
52. Software: Other modules
swad-core SWADroid
Affero GPL v3 license
https://github.com/acanas/swad-core
GPL v3 license
https://git.cuernodehipnos.es/Marown/SWADroid
387,435
C code lines
151
MySQL tables
39,216
Java code lines
17K
downloads
101 person-years
estimated effort*
9 person-years
estimated effort*
$5,579,446
estimated cost*
$500,680
estimated cost*
Other modules and more info: https://openswad.org/source
* According to the COCOMO model in Open Hub
53. Software: Other modules
●
iSWAD
●
App for iOS
https://apps.apple.com/es/app/iswad-platform/id1570162425
By Bate Ye (2021, Swift)
https://github.com/WolfYe98/iSWAD
54. Software: Other modules
●
Former developers:
Diego Montesinos Hervás (2011, Objective C)
https://github.com/diegort/iSWAD
Raúl Álvarez Hinojosa (2016, Swift)
https://github.com/Rauleinstein/iSWAD
Adrián Lara Roldán (2018, Swift)
https://github.com/mitomono/iSWAD
55. Timeline: Notes & Pubs
“You think you know when you learn, are more sure
when you can write, even more when you can teach,
but certain when you can program.”
Alan Perlis – Computer scientist and professor
58. Timeline: Notes & Pubs
●
Timeline: set of publications
●
from a user
●
global
●
Only me
●
Followed users
●
All users
typedef enum
{
Tml_Usr_TIMELINE_USR,
Tml_Usr_TIMELINE_GBL,
} Tml_Usr_UsrOrGbl_t;
typedef enum
{
Usr_WHO_UNKNOWN,
Usr_WHO_ME,
Usr_WHO_SELECTED, // Not applicable to timeline
Usr_WHO_FOLLOWED,
Usr_WHO_ALL,
} Usr_Who_t;
59. Timeline: Notes & Pubs
●
Publication: · original note (26851, 75% of 35968)
· shared note ( 1456, 4% of 35968)
· comment to a note ( 7661, 21% of 35968)
typedef enum
{
Tml_Pub_UNKNOWN = 0,
Tml_Pub_ORIGINAL_NOTE = 1,
Tml_Pub_SHARED_NOTE = 2,
Tml_Pub_COMMENT_TO_NOTE = 3,
} TmlPub_Type_t;
struct TmlPub_Publication
{
long PubCod; // Publication code
long NotCod; // Note code
long PublisherCod; // Sharer or writer of the publication
TmlPub_Type_t Type; // Original note, shared note, comment
struct TmlPub_Publication *Next; // Used for chained list
};
*swad.ugr.es, nov 2023
60. Timeline: Notes & Pubs
●
Note: timeline post ( 5484, 20% of 26851)
public file ( 82, <1% of 26851)
call for exam ( 3067, 11% of 26851)
notice (18011, 67% of 26851)
forum post ( 207, 1% of 26851)
*swad.ugr.es, nov 2023
61. Timeline: Notes & Pubs
typedef enum
{
TmlNot_UNKNOWN = 0,
/* Start tab */
TmlNot_POST = 10, // Post written directly in timeline
/* Institution tab */
TmlNot_INS_DOC_PUB_FILE = 1, // Public file in documents of institution
TmlNot_INS_SHA_PUB_FILE = 2, // Public file in shared files of institution
/* Center tab */
TmlNot_CTR_DOC_PUB_FILE = 3, // Public file in documents of center
TmlNot_CTR_SHA_PUB_FILE = 4, // Public file in shared files of center
/* Degree tab */
TmlNot_DEG_DOC_PUB_FILE = 5, // Public file in documents of degree
TmlNot_DEG_SHA_PUB_FILE = 6, // Public file in shared files of degree
/* Course tab */
TmlNot_CRS_DOC_PUB_FILE = 7, // Public file in documents of course
TmlNot_CRS_SHA_PUB_FILE = 8, // Public file in shared files of course
/* Assessment tab */
TmlNot_CALL_FOR_EXAM = 9, // Call for exam in a course
/* Users tab */
/* Messages tab */
TmlNot_NOTICE = 12, // A public notice in a course
TmlNot_FORUM_POST = 11, // Post in global/swad forums
/* Analytics tab */
/* Profile tab */
} TmlNot_Type_t;
62. Timeline: Notes & Pubs
struct TmlNot_Note
{
long NotCod; // Unique code/identifier for each note
TmlNot_Type_t Type; // Timeline post, public file,
// call for exam, notice, forum post...
long UsrCod; // Publisher
long HieCod; // Hierarchy code
// (institution/center/degree/course)
long Cod; // Code of file, forum post,
// notice, timeline post...
bool Unavailable; // File, forum post, notice...
// unavailable (removed)
time_t DateTimeUTC; // Date-time of publication in UTC time
unsigned NumShared; // Number of times (users)
// this note has been shared
unsigned NumFavs; // Number of times (users)
// this note has been favourited
};
63. Timeline: Notes & Pubs
__________________
|@author |
| Note |
|__________________|
|@author |
| Comment 1 |
|______________|
|@author |
| Comment 2 |
|______________|
| |
| ... |
|______________|
|@author |
| Comment n |
|______________|
●
A note can have comments attached to it:
68. Timeline: Database
mysql> DESCRIBE tml_pubs;
+--------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+----------------+
| PubCod | bigint | NO | PRI | NULL | auto_increment |
| NotCod | bigint | NO | MUL | NULL | |
| PublisherCod | int | NO | MUL | NULL | |
| PubType | tinyint | NO | MUL | NULL | |
| TimePublish | datetime | NO | MUL | NULL | |
+--------------+----------+------+-----+---------+----------------+
69. Timeline: Database
mysql> DESCRIBE tml_notes;
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| NotCod | bigint | NO | PRI | NULL | auto_increment |
| NoteType | tinyint | NO | MUL | NULL | |
| Cod | int | NO | | -1 | |
| UsrCod | int | NO | MUL | NULL | |
| HieCod | int | NO | | -1 | |
| Unavailable | enum('N','Y') | NO | | N | |
| TimeNote | datetime | NO | MUL | NULL | |
+-------------+---------------+------+-----+---------+----------------+
mysql> DESCRIBE tml_notes_fav;
+---------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+----------------+
| FavCod | bigint | NO | PRI | NULL | auto_increment |
| NotCod | bigint | NO | MUL | NULL | |
| UsrCod | int | NO | MUL | NULL | |
| TimeFav | datetime | NO | | NULL | |
+---------+----------+------+-----+---------+----------------+
70. Timeline: Database
mysql> DESCRIBE tml_comments;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| PubCod | bigint | NO | PRI | NULL | |
| Txt | longtext | NO | MUL | NULL | |
| MedCod | int | NO | MUL | -1 | |
+--------+----------+------+-----+---------+-------+
mysql> DESCRIBE tml_comments_fav;
+---------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------+------+-----+---------+----------------+
| FavCod | bigint | NO | PRI | NULL | auto_increment |
| PubCod | bigint | NO | MUL | NULL | |
| UsrCod | int | NO | MUL | NULL | |
| TimeFav | datetime | NO | | NULL | |
+---------+----------+------+-----+---------+----------------+
71. Timeline: Database
mysql> DESCRIBE tml_posts;
+--------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+----------------+
| PstCod | int | NO | PRI | NULL | auto_increment |
| Txt | longtext | NO | MUL | NULL | |
| MedCod | int | NO | MUL | -1 | |
+--------+----------+------+-----+---------+----------------+
mysql> DESCRIBE cfe_exams;
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| ExaCod | int | NO | PRI | NULL | auto_increment |
| ... | ... | ... | ... | ... | ... |
mysql> DESCRIBE brw_files;
+-----------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------+----------------+
| FilCod | int | NO | PRI | NULL | auto_increment |
| ... | ... | ... | ... | ... | ... |
mysql> DESCRIBE not_notices;
+-----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+----------------+
| NotCod | int | NO | PRI | NULL | auto_increment |
| ... | ... | ... | ... | ... | ... |
mysql> DESCRIBE for_posts;
+-----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+----------------+
| PstCod | int | NO | PRI | NULL | auto_increment |
| ... | ... | ... | ... | ... | ... |
72. Timeline: Database
mysql> DESCRIBE tml_timelines;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| SessionId | char(43) | NO | PRI | NULL | |
| NotCod | bigint | NO | PRI | NULL | |
+-----------+----------+------+-----+---------+-------+
mysql> DESCRIBE tml_tmp_timeline;
+--------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------+------+-----+---------+-------+
| NotCod | bigint | NO | PRI | NULL | NULL |
+--------+--------+------+-----+---------+-------+
What is being displayed on the screens of each of the users
What is being displayed on the current user's screen
73. Timeline: Database
●
Example of
database query:
unsigned TmlDB_GetPubDataByCod (long PubCod,
MYSQL_RES **mysql_res) {
return (unsigned)
DB_QuerySELECT (mysql_res,
"can not get data of publication",
"SELECT PubCod," // row[0]
"NotCod," // row[1]
"PublisherCod," // row[2]
"PubType" // row[3]
" FROM tml_pubs"
" WHERE PubCod=%ld",
PubCod);
}
void TmlPub_GetPubDataFromRow (MYSQL_RES *mysql_res,
struct TmlPub_Publication *Pub) {
MYSQL_ROW row;
row = mysql_fetch_row (mysql_res);
Pub->PubCod = Str_ConvertStrCodToLongCod (row[0]);
Pub->NotCod = Str_ConvertStrCodToLongCod (row[1]);
Pub->PublisherCod = Str_ConvertStrCodToLongCod (row[2]);
Pub->Type = TmlPub_GetPubTypeFromStr (row[3]);
}
74. Timeline: Database
unsigned long DB_QuerySELECT (MYSQL_RES **mysql_res,
const char *MsgError,
const char *fmt,...) {
va_list ap;
int NumBytesPrinted;
char *Query;
/***** Create query string *****/
va_start (ap,fmt);
NumBytesPrinted = vasprintf (&Query,fmt,ap);
va_end (ap);
if (NumBytesPrinted < 0) // -1 if no memory or any other error
Err_NotEnoughMemoryExit ();
/***** Do SELECT query *****/
return DB_QuerySELECTusingQueryStr (Query,mysql_res,MsgError);
}
static unsigned long DB_QuerySELECTusingQueryStr (char *Query,
MYSQL_RES **mysql_res,
const char *MsgError) {
int Result;
[...]
Result = mysql_query (&DB_Database.mysql,Query); // 0 on success
free (Query);
if (Result)
DB_ExitOnMySQLError (MsgError);
if ((*mysql_res = mysql_store_result (&DB_Database.mysql)) == NULL)
DB_ExitOnMySQLError (MsgError);
return (unsigned long) mysql_num_rows (*mysql_res);
}
75. Timeline: Getting pubs
“When I wrote this code, only God and I understood
what I did. Now only God knows.”
Unknown source
76. Timeline: Getting pubs
●
Our algorithm:
●
Select publications one by one in a loop
●
In each iteration:
●
Get the most recent publication (original, shared or comment)
checking that its note is not already retrieved
●
After getting a publication, save its note code to not get it again.
SELECT PubCod
FROM tml_pubs
WHERE NotCod NOT IN
(SELECT NotCod
FROM tml_tmp_timeline)
ORDER BY PubCod DESC
LIMIT 1;
77. Timeline: Getting pubs
●
Slower alternative (may need seconds for large tables):
●
Get the maximum PubCod, i.e more recent publication (original, shared or commment),
of every set of publications corresponding to the same note:
SELECT MAX(PubCod) AS NewestPubCod
FROM tml_pubs
GROUP BY NotCod
ORDER BY NewestPubCod DESC
LIMIT 10;
78. Timeline: Getting pubs
●
Restricting publications to mine and those I follow:
CREATE TEMPORARY TABLE fol_tmp_me_and_followed
(UsrCod INT NOT NULL,
UNIQUE INDEX(UsrCod)) ENGINE=MEMORY
SELECT my_usr_cod AS UsrCod
UNION
SELECT FollowedCod AS UsrCod
FROM usr_follow
WHERE FollowerCod=my_usr_cod;
------------------------------
SELECT tml_pubs.PubCod,
tml_pubs.NotCod,
tml_pubs.PublisherCod,
tml_pubs.PubType
FROM tml_pubs,
fol_tmp_me_and_followed
WHERE tml_pubs.PublisherCod=fol_tmp_me_and_followed.UsrCod
AND tml_pubs.NotCod NOT IN
(SELECT NotCod
FROM tml_tmp_timeline)
ORDER BY PubCod DESC
LIMIT 1;
mysql> DESCRIBE usr_follow;
+-------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| FollowerCod | int | NO | PRI | NULL | |
| FollowedCod | int | NO | PRI | NULL | |
| FollowTime | datetime | NO | MUL | NULL | |
+-------------+----------+------+-----+---------+-------+
79. Timeline: Getting pubs
●
Three types of timeline updates
_ ______________________
/ |______________________|
New < |______________________|
_|______________________|
_|_See_new_activity_(3)_|
/ |______________________|
| |______________________|
Recent < |______________________|
| |______________________|
_|______________________|
_|_______See_more_______|
/ |______________________|
| |______________________|
Old < |______________________|
| |______________________|
_|______________________|
typedef enum
{
Tml_GET_NEW_PUBS, // automatically
// from time
// to time (AJAX)
Tml_GET_REC_PUBS, // user clicks
// on menu
// or after
// editing
// timeline
Tml_GET_OLD_PUBS, // user clicks
// on bottom
// link (AJAX)
} Tml_WhatToGet_t;
81. Timeline: Getting pubs
case Tml_GET_REC_PUBS: // Get some limited recent publications
/* First query to get initial timeline shown
==> no notes yet in current timeline table */
RangePubsToGet->Top = 0;
/* _ _____ 0 <-- RangePubsToGet.Top = +infinite
/ |_____| 8
Get | |_____| 7
pubs < |_____| 6
from | |_____| 5
all | |_____| 4
range . |_____| 3
. |_____| 2
. |_____| 1
0 <-- RangePubsToGet.Bottom = -infinite */
RangePubsToGet->Bottom = 0;
82. Timeline: Getting pubs
case Tml_GET_NEW_PUBS: // Get the publications (without limit)
// newer than last pub. code
/* Via AJAX automatically from time to time */
RangePubsToGet->Top = 0;
/* _ _____ 0 <-- RangePubsToGet.Top = +infinite
Get / |_____|11
these < |_____|10
pubs _|_____| 9
/ |_____| 8 <-- RangePubsToGet.Bottom = last pub. code
Pubs | |_____| 7
already < |_____| 6
shown | |_____| 5
| |_____| 4
. |_____| .
. |_____| .
. |_____| .
*/
RangePubsToGet->Bottom = Tml_DB_GetPubCodFromSession (Tml_Pub_LAST);
83. Timeline: Getting pubs
case Tml_GET_OLD_PUBS: // Get some limited publications
// older than first pub. code
/* Via AJAX when I click in link to get old publications */
RangePubsToGet->Top = Tml_DB_GetPubCodFromSession (Tml_Pub_FIRST);
/* _____
. |_____| .
. |_____| .
. |_____| .
Pubs | |_____| 8
already < |_____| 7
shown | |_____| 6
| |_____| 5
Get _|_____| 4 <-- RangePubsToGet.Top = first pub. code
pubs / |_____| 3
from < |_____| 2
this _|_____| 1
rage 0 <-- RangePubsToGet.Bottom = -infinite */
RangePubsToGet->Bottom = 0;
84. Timeline: Getting pubs
●
Restricting publications to range:
SELECT tml_pubs.PubCod,
tml_pubs.NotCod,
tml_pubs.PublisherCod,
tml_pubs.PubType
FROM tml_pubs,
fol_tmp_me_and_followed
WHERE tml_pubs.PublisherCod=fol_tmp_me_and_followed.UsrCod
AND tml_pubs.PubCod>bottom // if type == Tml_GET_NEW_PUBS
AND tml_pubs.PubCod<top // if type == Tml_GET_OLD_PUBS
AND tml_pubs.NotCod NOT IN
(SELECT NotCod
FROM tml_tmp_timeline)
ORDER BY PubCod DESC
LIMIT 1;
85. Timeline: Getting pubs
Timeline->Pubs.Top Pub #0
______ ______ Pub #1
|______|------>|______| ______ Pub #2
|______| -> |______| ______ Pub #3
|______| / |______| ->|______| ______
|______| / |______| / |______| ->|______|
|_Next_|-- |______| / |______| // |______|
more recent |_Next_|-- |______| // |______|
______ |_Next_|--/ |______|
|______|---------------------------------------------- |_NULL_|
older
Timeline->Pubs.Bottom
●
After getting the publications, the result is a chained list:
87. Timeline: Showing pubs
_____
/ |_____| just_now_timeline_list (Posts retrieved automatically
| |_____| via AJAX from time to time.
| |_____| They are transferred inmediately
| | to new_timeline_list.)
Hidden < __v__
| |_____| new_timeline_list (Posts retrieved but hidden.
| |_____| When user clicks to view them,
| |_____| the most recent of each note
|_____| is transferred
| to visible timeline_list.)
See new activity (0)
__v__
/ |_____| timeline_list (Posts visible on page)
| |_____|
Visible | |_____|
on < |_____|
page | |_____|
| |_____|
|_____|
^
See more
__|__
/ |_____| old_timeline_list (Posts just retrieved via AJAX
| |_____| when user clicks "see more".
| |_____| They are transferred inmediately
Hidden < |_____| to timeline_list.)
| |_____|
| |_____|
|_____|
<ul id="just_now_timeline_list" ...>
</ul>
<ul id="new_timeline_list" ...>
</ul>
<div id="view_new_container" ...
style="display:none;">
<a href="" ...
onclick="moveNewTimelineToTimeline();
return false;">
See new activity
(<span id="view_new_count">
0
</span>)
</a>
</div>
<ul id="timeline_list" ...>
visible timeline
</ul>
<div id="view_old_container" ...>
<a href="" ...
onclick="...
refreshOldTimeline();
return false;">
...
See more
</a>
</div>
<ul id="old_timeline_list" ...>
</ul>
88. Timeline: Showing pubs
<head>
...
<script type="text/javascript" ...>
var delayNewTml = Cfg_TIME_TO_REFRESH_TIMELINE; // 2000 ms
function init() {
ActionAJAX = "SWAD_URL";
...
setTimeout('refreshNewTimeline()',delayNewTL);
...
}
</script>
<script type="text/javascript" ...>
var refreshParamIdSes = "ses=...";
var refreshParamNxtActNewPub = "act=...";
var refreshParamWho = "Who=...";
</script>
...
</head>
<body onload="init();">
...
</body>
●
Automatic refresh via AJAX every 2 s → 3 s → 4 s...
_____
/ |_____| just_now_timeline_list
| |_____|
| |_____|
| |
Hidden < __v__
| |_____| new_timeline_list
| |_____|
| |_____|
|_____|
|
See new activity (0)
__v__
/ |_____| timeline_list
| |_____|
Visible | |_____|
on < |_____|
page | |_____|
| |_____|
|_____|
^
See more
__|__
/ |_____| old_timeline_list
| |_____|
| |_____|
Hidden < |_____|
| |_____|
| |_____|
|_____|
90. Timeline: Showing pubs
function readNewTimelineData () {
if (objXMLHttpReqNewTml.readyState == 4) // Check if data have been received
if (objXMLHttpReqNewTml.status == 200) {
// Access to UL for just now timeline
var justNowTimeline = document.getElementById('just_now_timeline_list');
if (justNowTimeline) {
// Update list of publications in just now timeline
justNowTimeline.innerHTML = objXMLHttpReqNewTml.responseText;
var numNotesJustGot = justNowTimeline.childNodes.length;
if (numNotesJustGot) {// New notes received
// Scripts in timeline got via AJAX not executed ==> execute them
evalScriptsInElem (justNowTimeline);
// Process maths
MathJax.typeset();
...
_____
/ |_____| just_now_timeline_list
| |_____|
| |_____|
| |
Hidden < __v__
| |_____| new_timeline_list
| |_____|
| |_____|
|_____|
|
See new activity (0)
__v__
/ |_____| timeline_list
| |_____|
Visible | |_____|
on < |_____|
page | |_____|
| |_____|
|_____|
^
See more
__|__
/ |_____| old_timeline_list
| |_____|
| |_____|
Hidden < |_____|
| |_____|
| |_____|
|_____|
91. Timeline: Showing pubs
...
// Move all the LI elements (notes) in UL 'just_now_timeline_list'
// ...to the top of UL 'new_timeline_list'
var newTimeline = document.getElementById('new_timeline_list');
for (var i=0; i<numNotesJustGot; i++) {
// Move node from just now timeline to new timeline
newTimeline.insertBefore(justNowTimeline.lastChild,
newTimeline.firstChild);
newTimeline.firstChild.className += " Tml_NEW_PUB";
}
// Update number of notes in new timeline
var viewNewCount = document.getElementById('view_new_count');
viewNewCount.innerHTML = newTimeline.childNodes.length;
// Unhide message with number of notes if hidden
var viewNewContainer = document.getElementById('view_new_container');
viewNewContainer.style.display = '';
}
}
// Global delay variable is set initially in swad-core
delayNewTml += 1000; // Increase one second on each call
setTimeout('refreshNewTimeline()',delayNewTml);
}
}
_____
/ |_____| just_now_timeline_list
| |_____|
| |_____|
| |
Hidden < __v__
| |_____| new_timeline_list
| |_____|
| |_____|
|_____|
|
See new activity (0)
__v__
/ |_____| timeline_list
| |_____|
Visible | |_____|
on < |_____|
page | |_____|
| |_____|
|_____|
^
See more
__|__
/ |_____| old_timeline_list
| |_____|
| |_____|
Hidden < |_____|
| |_____|
| |_____|
|_____|
92. _____
/ |_____| just_now_timeline_list
| |_____|
| |_____|
| |
Hidden < __v__
| |_____| new_timeline_list
| |_____|
| |_____|
|_____|
|
See new activity (0)
__v__
/ |_____| timeline_list
| |_____|
Visible | |_____|
on < |_____|
page | |_____|
| |_____|
|_____|
^
See more
__|__
/ |_____| old_timeline_list
| |_____|
| |_____|
Hidden < |_____|
| |_____|
| |_____|
|_____|
Timeline: Showing pubs
function moveNewTimelineToTimeline () {
// Move the LI elements (notes) in UL 'new_timeline_list'...
// ...to the top of UL 'timeline_list', only if not repeated before
var newTimeline = document.getElementById('new_timeline_list');
var numNewNotes = newTimeline.childNodes.length;
if (numNewNotes) {
var timeline = document.getElementById("timeline_list");
for (var i=1; i<=numNewNotes; i++) {
// Check if the last child (the oldest) in the new timeline...
// ...is the last ocurrence of the note
var mostRecentOcurrenceOfNote = true;
var lastChildIndex = numNewNotes - i;
var noteCode = newTimeline.lastChild.dataset.noteCode;
for (var j=0; j<lastChildIndex; j++)
if (newTimeline.childNodes[j].dataset.noteCode == noteCode) {
mostRecentOcurrenceOfNote = false;
break;
}
...
●
User clicks "See new activity" → View new pubs.
93. Timeline: Showing pubs
...
// Move or remove node from new timeline
if (mostRecentOcurrenceOfNote) {
// Move node from new timeline to timeline
timeline.insertBefore(newTimeline.lastChild,timeline.firstChild);
timeline.firstChild.className += " Tml_NEW_PUB";
}
else
// Remove last child (because is repeated in more recent pubs)
newTimeline.removeChild(newTimeline.lastChild);
}
}
// Reset number of new publications after moving
var viewNewCount = document.getElementById('view_new_count');
viewNewCount.innerHTML = 0;
// Hide link to view new publications after moving
var viewNewContainer = document.getElementById('view_new_container');
viewNewContainer.style.display = 'none';
}
_____
/ |_____| just_now_timeline_list
| |_____|
| |_____|
| |
Hidden < __v__
| |_____| new_timeline_list
| |_____|
| |_____|
|_____|
|
See new activity (0)
__v__
/ |_____| timeline_list
| |_____|
Visible | |_____|
on < |_____|
page | |_____|
| |_____|
|_____|
^
See more
__|__
/ |_____| old_timeline_list
| |_____|
| |_____|
Hidden < |_____|
| |_____|
| |_____|
|_____|
94. _____
/ |_____| just_now_timeline_list
| |_____|
| |_____|
| |
Hidden < __v__
| |_____| new_timeline_list
| |_____|
| |_____|
|_____|
|
See new activity (0)
__v__
/ |_____| timeline_list
| |_____|
Visible | |_____|
on < |_____|
page | |_____|
| |_____|
|_____|
^
See more
__|__
/ |_____| old_timeline_list
| |_____|
| |_____|
Hidden < |_____|
| |_____|
| |_____|
|_____|
Timeline: Showing pubs
var objXMLHttpReqOldTml = false;
function refreshOldTimeline () {
objXMLHttpReqOldTml = AJAXCreateObject (); // new XMLHttpRequest()
if (objXMLHttpReqOldTml) {
var refreshParams = refreshParamNxtActOldPub + '&' +
refreshParamIdSes;
if (typeof refreshParamUsr !== 'undefined') {
if (refreshParamUsr.length)
refreshParams += '&' + refreshParamUsr;
}
if (typeof refreshParamWho !== 'undefined') {
if (refreshParamWho.length)
refreshParams += '&' + refreshParamWho;
}
objXMLHttpReqOldTml.onreadystatechange = readOldTimelineData;
objXMLHttpReqOldTml.open('POST',actionAJAX,true);
objXMLHttpReqOldTml.setRequestHeader('Content-Type',
'application/x-www-form-urlencoded');
objXMLHttpReqOldTml.send(refreshParams);
}
}
●
User clicks "See more..." → View old pubs.
95. Timeline: Showing pubs
function readOldTimelineData () {
if (objXMLHttpReqOldTml.readyState == 4) // Check if data have been received
if (objXMLHttpReqOldTml.status == 200) {
// Access to UL with the old timeline
var oldTimeline = document.getElementById('old_timeline_list');
if (oldTimeline) {
// Fill list of publications in old timeline
oldTimeline.innerHTML = objXMLHttpReqOldTml.responseText;
var countOldTimeline = oldTimeline.childNodes.length;
if (countOldTimeline) {
// Scripts in timeline got via AJAX not executed ==> execute them
evalScriptsInElem (oldTimeline);
// Process maths
MathJax.typeset();
// Move all elements in 'old_timeline_list to bottom of 'timeline_list'
var timeline = document.getElementById("timeline_list");
for (var i=0; i<countOldTimeline; i++)
timeline.appendChild(oldTimeline.firstChild);
}
else // No old publications retrieved, so we have reached the oldest pub.
// Hide container with link to get old publications
document.getElementById("view_old_pubs_container").style.display = 'none';
}
}
}
_____
/ |_____| just_now_timeline_list
| |_____|
| |_____|
| |
Hidden < __v__
| |_____| new_timeline_list
| |_____|
| |_____|
|_____|
|
See new activity (0)
__v__
/ |_____| timeline_list
| |_____|
Visible | |_____|
on < |_____|
page | |_____|
| |_____|
|_____|
^
See more
__|__
/ |_____| old_timeline_list
| |_____|
| |_____|
Hidden < |_____|
| |_____|
| |_____|
|_____|
96. Timeline: Layout
“If you find an element of your interface requires
instructions, then you need to redesign it.”
Dan Rubin – Designer, photographer
109. Timeline: Layout
function updateDivFaversSharers (form,Params) {
var id = form.parentNode.parentNode.id;
var objXMLHttp = AJAXCreateObject ();
if (objXMLHttp) {
/* Send request to server */
objXMLHttp.onreadystatechange = function () {
if (objXMLHttp.readyState == 4) // Check if data have been received
if (objXMLHttp.status == 200)
if (id) {
var div = document.getElementById (id); // Access to DIV
if (div)
div.innerHTML = objXMLHttp.responseText; // Update DIV content
}
};
objXMLHttp.open ('POST',actionAJAX,true);
objXMLHttp.setRequestHeader ('Content-Type','application/x-www-form-urlencoded');
objXMLHttp.send (Params);
}
}
127. Timeline: Inserting links
“Some of the best programming is done on paper.
Putting it into the computer is just a minor detail.”
Max Kanat-Alexander – Software Engineer at Google, author of Code Simplicity
128. Timeline: Inserting links
●
1. Parse string creating a list of links (URLs or nicknames)
●
Hi @admin, can I use https://openswad.org for free?
______ ______ ______ ______
|______|<-- -->|______|<-- -->|______|<-- -->|______|<--- LastLink
|______| / |______| / |______| / |______|
|______| / |______| / |______| / |______|
|_NULL_| / ---|_Prev_| / ---|_Prev_| / ---|_Prev_|
|_Next_|-- |_Next_|-- |_Next_|-- |_NULL_|
struct ALn_Link
{
ALn_LinkType_t Type; // URL or nickname?
struct ALn_Substring URLorNick; // Link text
struct ALn_Substring NickAnchor[3]; // Pointer to anchors if nick
size_t LengthAddedUpToHere; // Total length of extra HTML code...
// ...added up to this link (included)
struct ALn_Link *Prev; // Pointer to previous link
struct ALn_Link *Next; // Pointer to next link
};
struct ALn_Substring
{
// Pointer to
// the first
// char of
// substring
char *Str;
// Length of
// the substring
size_t Len;
};
129. Timeline: Inserting links
●
2. For each link in the list, going back from last to first:
●
1 Move forward the text after the link
●
2 Copy the 3rd part of the anchor
●
3 Move forward the link
_______________________________
|H|i|_|@|a|d|m|i|n|,|_|c|a|n|...|
| | | | | | | | | | | | | | |
| | | | | | | | | ___________________________________________1____
| | |
| | | ______________________________3____ | | | | | |
| | | | | | | | |
| | | ______5____ | | | | | | | | | | | |
| | | | | | | | | | | | | | |
| | | 6 | | | | | | 4 | | | | | | 2 | | | | | |
v v v anchor#1 v v v v v v anchor#2 v v v v v v anchor#3 v v v v v v
___________________________________________________________________________
|H|i|_|<|_|_|_|_|@|a|d|m|i|n|_|_|_|_|>|@|a|d|m|i|n|<|_|_|_|_|>|,|_|c|a|n|...|
●
4 Copy the 2nd part of the anchor
●
5 Copy the link into the anchor
●
6 Copy the 1st part of the anchor
130. Miss: Written in C
“The C language combines
all the power of assembly language
with all the ease-of-use of assembly language.”
Mark Pearce – Freelance consultant and developer
131. Miss: Written in C
●
swad-core written from scratch in C
✘Disadvantages:
●
lack of specialized library functions for the web
●
rejected by potential collaborators who see it as an old programming
language
132. Hit: Written in C
“The C language combines
all the power of assembly language
with all the ease-of-use of assembly language.”
Mark Pearce – Freelance consultant and developer
133. Hit: Written in C
●
swad-core written from scratch in C
Advantages:
●
It requires few resources
●
+ speed
●
- memory
●
swad-core executable: 3.2 MB
●
Functional even in a Raspberry Pi
●
Reliability
●
Compile-time error detection
●
It works 24 hours, fast and almost without failures
●
Source code stability over time
134. Hit: It's fast, you don't
need a cluster
“Software is getting slower more rapidly than
hardware is becoming faster.” (Wirth's law)
Niklaus Wirth – Designer of several programming languages, including Pascal
135. ●
SWAD-UGR former servers (1999-2016)
2nd: 2004-2006
Pentium 4 HT
RAM 2 GiB
2 HD 160 GB
Fedora 3
3rd: 2007-2008
Core 2 Duo
RAM 4 GiB
2 HD 500 GB
Fedora 6
4th: 2009-2010
Core 2 Quad
RAM 4 GiB
2 HD 146 GB
2 HD 1 TB
Fedora 10
5th: 2011-2016
2 Xeon Quad
RAM 24 GiB
4 HD 146 GB
4 HD 500 GB
CentOS 5.7
1st: 1999-2003
Shared server
Hit: It's fast, you don't need a cluster
136. Hit: It's fast, you don't need a cluster
●
SWAD-UGR current server (6th: 2016-2023)
●
HP Proliant DL160 G9, 2 Xeon with 6 cores, RAM 32 GiB
4 HD 146 GB
SAS 15000 rpm
RAID 1+0 (292 GB)
SO CentOS 7.2
MySQL database
4 HD 1 TB
SAS 7200 rpm
RAID 5 (3 TB)
Web files
( /var/www )